Notatki PHP

prywatne zapiski na kamieniu

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 = $assocarray_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)