Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]wybieranie duplikatów z tablicy i ....
phpamator
post 8.02.2021, 21:55:32
Post #1





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


Hello hello, tu znowu Ja wasz phpamator tongue.gif

Potrzebuję pomocy w takiej kwestii.
Mam tablicę w której mam np 20 wierszy. W tych wierszach występuje w jednej z kolumn ta sama wartość i .... część innych wartości jest inna. Chciałbym wyciągać kolejno tylko te wiersze w których występuje np "ala ma kota"
po czym utworzoną tablicę przepuścić przez loop i poukładać tak aby utworzyć jeden wiersz ale w kolumnach tam gdzie wartości są rózne budowały się kolejne tablice.
Chyba zamieszałem ...

przykład:

CSV:
ID, Nazwa, ilość, dodatek1, dodatek2, dodatek3
1,Nazwa1,1,czeresnia,banan,ogorek
2,Nazwa2,10,wisnia,pomidor,ogoirek
3,Nazwa1,15,jablko,gruszka,por
4,Nazwa2,10,wisnia,pomidor,ogoirek
5,Nazwa2,10,wisnia,pomidor,ogoirek
(wciągam i przerabiam do tablicy asocjacyjnej - z headerami)

I teraz w prosty sposób chciałbym wyciągnąc najpierw Nazwa1 i pozbierać dp kupy dadatki
następnie Nazwa 2 i to samo

tyle, że nie bardzo wiem jak się do tego zabrać ....

Podpowiedzcie proszę ....

pomyślałem, że mógłbym w pierwszej kolejności utworzyć listę "nazw" i następnie kolejno wybierać te wiersze w których nazwa = nazwa1 i zbierać dane następnie nazwa2 i zbierać
czy to głupi pomysł ?


Ten post edytował phpamator 8.02.2021, 22:02:56
Go to the top of the page
+Quote Post
Tomplus
post 8.02.2021, 22:05:27
Post #2





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Zamieszałeś.

Ale jeżeli masz to jako CSV, to nie lepiej od razu zamienić kod na tablicę, a następnie iterować po niej, wyszukując w kluczu [1] nazwę "Ala ma kota"? Dzięki temu, szybciej i efektywniej wyświetlisz oczekiwaną treść niż szukając linia po linii, a potem zamieniając na tablicę.
Go to the top of the page
+Quote Post
phpamator
post 8.02.2021, 22:14:01
Post #3





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


trochę zamieszałem.

Dlatego pomyślałem, że najlepiej byłoby w pierwszej kolejności utworzyć listę nazw i następnie lecieć kolejno przez tablicę wybierając wiersze w których nazwa = wartość z listy ....

Zacząłem tak:
  1.  
  2. // wczytuje plik
  3. $rows = array_map('str_getcsv', file('test_2.csv'));
  4.  
  5. $header = array_shift($rows);
  6.  
  7. $csv = array();
  8. // przepuszczam aby utworzyć tablicę asocjacyjną
  9. foreach($rows as $row)
  10. {
  11. $csv[] = array_combine($header, $row);
  12. }
  13. // i tu już mam na czym pracować :) tylko nie wiem jak wybierać te linie gdzie znajdują się te same/identyczne nazwy


Ten post edytował phpamator 8.02.2021, 22:16:14
Go to the top of the page
+Quote Post
trueblue
post 9.02.2021, 08:16:58
Post #4





Grupa: Zarejestrowani
Postów: 6 800
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A nie możesz wrzucać nazwy jako klucz tablicy, a reszty kolumn jako wartości?
Jeśli klucz nie istnieje, to tworzysz element, jeśli istnieje, to kolumny dołączasz.


--------------------
Go to the top of the page
+Quote Post
YourFrog
post 9.02.2021, 11:18:47
Post #5





Grupa: Zarejestrowani
Postów: 124
Pomógł: 22
Dołączył: 10.01.2014

Ostrzeżenie: (0%)
-----


Jeśli dobrze zrozumiałem to spróbuj coś takiego (później przeczytaj moją uwagę na dole)

  1. <?php
  2.  
  3. $content = 'ID, Nazwa, ilość, dodatek1, dodatek2, dodatek3
  4. 1,Nazwa1,1,czeresnia,banan,ogorek
  5. 4,Nazwa2,10,wisnia,pomidor,ogoirek
  6. 2,Nazwa2,10,wisnia,pomidor,ogoirek
  7. 3,Nazwa1,15,jablko,gruszka,por
  8. 4,Nazwa2,10,wisnia,pomidor,ogoirek
  9. 5,Nazwa2,10,wisnia,pomidor,ogoirek';
  10.  
  11. # Mapujemy string'a na tablice
  12. $arr = array_map('trim', str_getcsv($content, "\n"));
  13.  
  14. # Wyciagamy nagłówki
  15. $header = str_getcsv($arr[0]);
  16.  
  17. # Wyciągamy rekordy z danych
  18. $records = [];
  19. $cc = count($arr);
  20. for($i = 1; $i < $cc; $i++) {
  21. $records[] = str_getcsv($arr[$i]);
  22. }
  23.  
  24. # Szukamy indeksu kolumny na podstawie nagłówka
  25. $columnIndex = array_search('Nazwa', $header);
  26.  
  27. # Wyszukujemy unikalnych wartości w danej kolumnie
  28. $columnValues = array_unique(array_column($records, $columnIndex));
  29.  
  30. $cc = count($columnValues);
  31. for($i = 0; $i < $cc; $i++) {
  32. $columnValue = $columnValues[$i];
  33.  
  34. foreach($records as $record) {
  35. if( $record[$columnIndex] != $columnValue ) {
  36. continue;
  37. }
  38.  
  39. # Tutaj już jesteś pewien że będziesz miał elementy w kolejności
  40. var_dump('---' . $i, $record);
  41. }
  42. }



Tego rozwiązania nie wolno wykorzystywać dla dużych plików CSV ponieważ mocno będzie zżerać pamięć komputera. W takich przypadkach radzę kilka razy przejść po pliku przy pomocy "fgetcsv"
Go to the top of the page
+Quote Post
phpamator
post 9.02.2021, 23:19:17
Post #6





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


Czegoś się tutaj nie dopatrzyłem chyba, var_dump powinien coś wyrzucić cy to tylko przykład "niedziałający" questionmark.gif smile.gif

Go to the top of the page
+Quote Post
YourFrog
post 10.02.2021, 13:37:18
Post #7





Grupa: Zarejestrowani
Postów: 124
Pomógł: 22
Dołączył: 10.01.2014

Ostrzeżenie: (0%)
-----


Przecież var_dump się wykonuje. Link do sandboxa poniżej.

http://sandbox.onlinephpfunctions.com/code...71375852e5768f3
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.06.2025 - 10:18