Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]porównanie tablic, elementy unikalne
Forum PHP.pl > Forum > Przedszkole
@rtur
mam 2 tablice:
  1. $array1= array(
  2. 0=>array('zwierze'=>'kot','rasa'=>'pers'),
  3. 1=>array('zwierze'=>'kot','rasa'=>'dachowiec'),
  4. 2=>array('zwierze'=>'pies','rasa'=>'jamnik'),
  5. );
  6. $array2= array(
  7. 0=>array('zwierze'=>'kot','rasa'=>'abisyński'),
  8. 1=>array('zwierze'=>'pies','rasa'=>'dog niemiecki'),
  9. 2=>array('zwierze'=>'kot','rasa'=>'pers'),
  10.  
  11. );

Jak stworzyć z tych dwóch tablic 3 tablicę $array3 zawierającą tylko to co się nie powtarza obu tablicach a znajduje się w $array2
  1. $array3= array(
  2. 0=>array('zwierze'=>'pies','rasa'=>'dog niemiecki'),
  3. 1=>array('zwierze'=>'kot','rasa'=>'abisyński'),
  4. );


próbowałem porównać dwie tablice poleceniem
  1. $array3 = array_diff($array1,$array2);
ale pokazuje 0 elementów.
Kshyhoo
Suma tablic: array_merge() łączy tablice, a array_unique() usuwa duplikaty.
Częśc wspólna: array_intersect() tworzy przecięcie tablic.
Różnica: array_diff() wykonuje różnicę zbiorów/tablic.
@rtur
1. wykonuje najpierw połączenie tablic $array3 = array_merge($array1,$array2), i jak rozumiem mam jedną tablicę $array3 później usuwam z niej duplikaty poprzez $array3= array_unique($array3)?
2. część wspólna ale których tablic $array4 = array_intersect($array1,$array2)?
3. różnica - $array5 = array_diff($array3, $array4) ?

cały kod:
  1. $array3 = array_merge($array1,$array2);
  2. $array3 = array_unique($array3);
  3. $array4 = array_intersect($array1,$array2);
  4. $array5 = array_diff($array3, $array4)
i w $array5 mam to co ja chce?

chyba nie bardzo działa wg tego co napisałem wyżej
  1. $inters = array_intersect($array1,$array2);
  2. $merge = array_merge($array1,$array2);
  3. $unique = array_unique($merge);
  4. $diff1 = array_diff($inters,$unique);
  5. $diff2 = array_diff($unique,$inters);
  6. var_dump($diff1);
  7. var_dump($diff2);

zwiaca:
  1. array(0) {
  2. }
  3. array(0) {
  4. }
session
  1. <?php
  2. $array1= array(
  3. 0=>array('zwierze'=>'kot','rasa'=>'pers'),
  4. 1=>array('zwierze'=>'kot','rasa'=>'dachowiec'),
  5. 2=>array('zwierze'=>'pies','rasa'=>'jamnik'),
  6. );
  7. $array2= array(
  8. 0=>array('zwierze'=>'kot','rasa'=>'abisyński'),
  9. 1=>array('zwierze'=>'pies','rasa'=>'dog niemiecki'),
  10. 2=>array('zwierze'=>'kot','rasa'=>'pers'),
  11. );
  12. $array_tmp=array_merge($array2,$array1); // kolejność jest istotna na dalszym etapie
  13. $i=0;
  14. foreach($array_tmp as $q){ // zamieniamy na tablicę jednowymiarową
  15. $array_tmp[$i++]=implode('|',$q); //znak który nie jest używany w wartościach
  16. }
  17. $i=0;
  18. foreach($array2[0] as $k => $v){ // zapisujemy sobie nazwy kluczy, wybór $array2[0] jest totalnie obojętny, może być $array1[5] (o ile istnieje) ponieważ zakładamy że każda tablica ma tyle samo elementów
  19. $keys[$i++]=$k;
  20. }
  21. $array_master=array_slice($array_tmp,0,count($array2)); // wybieramy tablicę $array2 zamienioną na jednowymiarową
  22. $array_slave=array_slice($array_tmp,count($array2)); // wybieramy tablicę $array1 zamienioną na jednowymiarową
  23. $array_tmp=array_diff($array_master,$array_slave); // główna operacja
  24. $array3=array(); $i=0;
  25. foreach($array_tmp as $v){ // zamieniamy na tablicę dwuwymiarową zgodnie z pierwotnymi kluczami
  26. $result=explode('|',$v);
  27. $word=array();
  28. $j=0;
  29. foreach($keys as $k){
  30. $word[$k]=$result[$j++];
  31. }
  32. $array3[$i++]=$word;
  33. }
  34. array_tmp=array();
  35. var_dump($array3);
  36. ?>


Jeśli wykonywałeś swój kod na podanych przez siebie tablicach to w ogóle dziwne, że w jakikolwiek sposób to działało ponieważ w większości te funkcje nie nadają się do wielowymiarowych tablic. Przynajmniej u mnie wywalało jak najbardziej poprawny błąd smile.gif . Dlatego też najpierw zamieniam tablicę dwuwymiarową na jednowymiarową, i na niej dokonuję operacji. Ogólnie kod możnaby zdecydowanie skrócić, ale postawiłem na uniwersalność, dzięki temu nie musisz podawać kluczy ponieważ najpierw jest tworzona tablica, która zawiera te klucze. Założenie które musi być spełnione jest takie, że tablica jest dwuwymiarowa oraz ilość poszczegolnych elementów musi być stała. Natomiast to co na pewno można zrobić to zrezygnować ze zmiennych array_master i array_slave i wrzucić ich wartość bezpośrenio do array_diff, chciałem żeby kod był czytelny. W implode i explode tak jak wspomniałem separator nie może występować w wartościach z wiadomych powodów. Kod można łatwo zmienić tak, aby działal z innego rodzaju tablicami wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.