Come uso arrays_udiff () correttamente?

Ho due arrays multidimensionali che assomigliano a qualcosa del genere:

Array ( [0] => Array ( 'id' => 3, 'other' => 'some string', 'timestamp' => 2000-01-01 00:00:00 ), [1] => Array ( 'id' => 6, 'other' => 'another string', 'timestamp' => 1835-01-01 00:00:00 ) ) 

Sto cercando di trovare un modo per capire quali elementi compaiono in un arrays ( $b ), ma non l'altro ( $a ) e se ci sono elementi con valori modificati. Se $a è:

 Array ( [0] => Array ( 'id' => 3, 'other' => 'some string', 'timestamp' => 2000-01-01 00:00:00 ) ) 

e $b è:

 Array ( [0] => Array ( 'id' => 3, 'other' => 'some string', 'timestamp' => 2000-01-01 12:12:12 ), [1] => Array ( 'id' => 4, 'other' => 'some string', 'timestamp' => 1900-01-01 01:12:23 ) ) 

Quindi la function dovrebbe tornare:

 Array ( [0] => Array ( 'id' => 3, 'other' => 'some string', 'timestamp' => 2000-01-01 12:12:12 ), [1] => Array ( 'id' => 4, 'other' => 'some string', 'timestamp' => 1900-01-01 01:12:23 ) ) 

perché l'elemento con id = 3 è stato modificato (il field timestamp ) e l'elemento con id = 4 è nuovo e non appare nell'altro arrays.

Ho cercato di farlo con arrays_udiff , ma non so ancora come funzioni (sembra che sia in grado di ordinare prima entrambi gli arrays, ma come fa il confronto?). arrays_udiff è il metodo corretto o dovrei scrivere una function personalizzata?

È ansible utilizzare arrays_udiff e definire il proprio callback di confronto. Suppongo che entrambi gli arrays abbiano esattamente la stessa struttura.

È ansible definire la propria function di callback come segue:

 int comparison(Array $a, Array $b){ if ($a['id']==$b['id'] && $a['other']==$b['other'] && $a['timestamp']==$b['timestamp']){ return 0 }else{ return -1 } } 

La function di callback deve restituire un numero integer negativo se il primo argomento è inferiore al secondo; un numero positivo se è più grande; o 0 se è uguale. Quindi, è ansible restituire qualsiasi numero diverso da 0 per indicare che gli argomenti sono diversi e 0 se sono uguali.

Infine, dovresti call arrays_udiff come segue:

 arrays_udiff($a, $b, 'comparison') 

E otterrai un elenco degli elementi di $a che non sono, o sono diversi in $b .

Si noti che se si desidera confrontare 2 arrays quando uno dei due ha più elementi rispetto all'altro, è necessario passare come primo argomento la matrix con i nuovi elementi.

Il return per la function arrays_udiff "data_compare_func" è una function che si definisce ma deve restituire un numero integer inferiore, uguale o maggiore di zero, quindi probabilmente non è la function giusta per le proprie esigenze. Una function personalizzata come questa dovrebbe darti quello che ti serve:

 // this function loops through both arrayss to find a match in the other arrays // it will skip entry comparisons when it goes through $arr2 because you already did it the first time function find_diff($arr1, $arr2) { $ret = arrays(); // we need to do two loops to find missing entries from both arrayss $ret = do_loop($arr1, $arr2, $ret, true); $ret = do_loop($arr2, $arr1, $ret, false); return $ret; } // this function does the looping though $arr1 to compare it to entries in $arr2 // you can skip entry comparison if $compare_entries is false function do_loop($arr1, $arr2, $ret, $compare_entries = true) { //look through all of $arr1 for same element in $arr2 based on $id for ($i=0;$i<count($arr1);$i++) { $id = $arr1[$i]['id']; $found = false; for ($j=0;$j<count($arr2);$j++) { // id match found if ($id == $arr2[$j]['id']) { $found = true; // only compare entries if you need to if ($compare_entries) { //check if other field is different if (strcmp($arr1[$i]['other'],$arr2[$j]['other']) != 0) { $ret = add_to_ret($arr1[$i], $ret); break; } //check if timestamp field is different if (strcmp($arr1[$i]['timestamp'],$arr2[$j]['timestamp']) != 0) { $ret = add_to_ret($arr1[$i], $ret); break; } } else { break; } } } // entry from $arr1[$i] was not found in $arr2 if (!$found) { $ret = add_to_ret($arr1[$i], $ret); } } return $ret; } //this function only adds the new entry to $ret if it's ID isn't already in $ret function add_to_ret($entry, $ret) { $id = $entry['id']; for ($i=0;$i<count($ret);$i++) { if ($id == $ret[$i]['id']) { //skip adding, its already in there return $ret; } } //add it in $ret[] = $entry; return $ret; }