Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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
 
Start new topic
Odpowiedzi
session
post
Post #2





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

Posty w temacie


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: 11.10.2025 - 06:04