Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]porównanie tablic, elementy unikalne
@rtur
post
Post #1





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

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


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.
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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.
Go to the top of the page
+Quote Post
@rtur
post
Post #3





Grupa: Zarejestrowani
Postów: 254
Pomógł: 3
Dołączył: 23.02.2006

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


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. }
Go to the top of the page
+Quote Post
session
post
Post #4





Grupa: Zarejestrowani
Postów: 112
Pomógł: 22
Dołączył: 11.04.2010
Skąd: Tarnów

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


  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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/wink.gif)

Ten post edytował session 24.05.2015, 10:08:28
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 18.09.2025 - 09:45