Mamy funkcję:
function array_diff_values($tab1, $tab2) { $result = array(); foreach($tab1 as $values) if(! in_array($values, $tab2)) $result[] = $values; return $result; }
Porównajmy dwie tablice:
$tablica1 = array ("zielony", "czerwony", "niebieski", "czerwony", "fioletowy"); $tablica2 = array ("zielony", "żółty", "czerwony");
Wynik porównania to tablica elementów unikalnych w $tablica1:
:
array (2) 0 => "niebieski" (9) 1 => "fioletowy" (9)
Inny sposób:
function array_unique_diff ($array1, $array2) { array_merge(array_diff_key($array1, $array2), array_diff_key($array2, $array1)); }
Weźmy:
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4); $array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
array_diff_key($array1, $array2); zwróci:
array ( 'red' => 2, 'purple' => 4 )
a w drugą stronę, array_diff_key($array2, $array1); zwróci:
array ( 'yellow' => 7, 'cyan' => 8, )
natomiast z funkcji array_unique_diff($array1, $array2); otrzymamy różnicę tablic:
array ( 'red' => 2, 'purple' => 4, 'yellow' => 7, 'cyan' => 8, )
Weźmy teraz w kolejnym przykładzie dwie tablice z bazy danych:
$records = array( array( 'id' => 2135, 'first_name' => 'Jaśko', 'last_name' => 'Pawlak', ), array( 'id' => 3245, 'first_name' => 'John', 'last_name' => 'Smith', ), array( 'id' => 5342, 'first_name' => 'Kaśka', 'last_name' => 'Pawlaczka', ), array( 'id' => 5623, 'first_name' => 'Jack', 'last_name' => 'September', ) ); $records2 = [ [ 'id' => 2135, 'first_name' => 'John' ], [ 'id' => 3245, 'first_name' => 'Sally' ], [ 'id' => 5342, 'first_name' => 'Jane' ], [ 'id' => 5623, 'first_name' => 'Peter' ], [ 'id' => 6982, 'first_name' => 'Sally' ] ]; function n_array_diff_assoc($a1, $a2, $assoc=true) { $r = array(); if(is_array(current($a1))): foreach($a1 as $k => $v): if(isset($a2[$k])): $diff = n_array_diff_assoc($a1[$k], $a2[$k], $assoc); if (!empty($diff)): $r[$k] = $diff; endif; else: $r[$k] = $v; endif; endforeach; else: $r = $assoc ? array_diff_assoc($a1, $a2) : array_diff_key($a1, $a2); endif; return $r; } $c = n_array_diff_assoc($records, $records2); var_dump($c);
Z pierwszej tablicy zostały wyeliminowane elementy znalezione w drugiej tablicy:
array (4) 0 => array (2) first_name => "Jaśko" (6) last_name => "Pawlak" (6) 1 => array (2) first_name => "John" (4) last_name => "Smith" (5) 2 => array (2) first_name => "Kaśka" (6) last_name => "Pawlaczka" (9) 3 => array (2) first_name => "Jack" (4) last_name => "September" (9)
Jeśli dla tablic z naszego przykładu, tym co ma eliminować z tablic jest obecność takich samych kluczy, to funkcja:
function array_diff_key_recursive (array $arr1, array $arr2) { $diff = array_diff_key($arr1, $arr2); $intersect = array_intersect_key($arr1, $arr2); foreach ($intersect as $k => $v) { if (is_array($arr1[$k]) && is_array($arr2[$k])) { $d = array_diff_key_recursive($arr1[$k], $arr2[$k]); if ($d) { $diff[$k] = $d; } } } return $diff; } $c = array_diff_key_recursive($records, $records2); var_dump($c);
da w efekcie tylko unikalne z pierwszej tablicy same nazwiska:
array (4) 0 => array (1) last_name => "Pawlak" (6) 1 => array (1) last_name => "Smith" (5) 2 => array (1) last_name => "Pawlaczka" (9) 3 => array (1) last_name => "September" (9)
Powiedzmy, że chcemy teraz z naszych dwóch porównywanych tablic uzyskać unikalny rekord drugiej tablicy $records2.
function array_unique_diff_key ($array1, $array2) { if (is_array($array1) && is_array($array2)) return array_diff_key($array1, $array2) + array_diff_key($array2, $array1); else if (is_array($array1)) return $array1; else if (is_array($array2)) return $array2; else return array(); } $c = array_unique_diff_key($records, $records2); var_dump($c);
Otrzymamy:
array (1) 4 => array (2) id => 6982 first_name => "Sally" (5)