我認為這裡使用類別的範例過於複雜,無法清楚示範此函式的功能。
array_udiff() 會遍歷 array_values($a) 和 array_values($b),並使用傳入的回呼函式比較每個值。
換句話說,array_udiff() 會使用提供的回呼函式將 $a[0] 與 $b[0]、$b[1]、$b[2] 和 $b[3] 進行比較。如果回呼函式在任何比較中返回零,則 $a[0] 將不會包含在 array_udiff() 返回的陣列中。然後它會將 $a[1] 與 $b[0]、$b[1]、$b[2] 和 $b[3] 進行比較。最後,將 $a[2] 與 $b[0]、$b[1]、$b[2] 和 $b[3] 進行比較。
例如,compare_ids($a[0], $b[0]) === -5,而 compare_ids($a[1], $b[1]) === 0。因此,$a[1] 不會從 array_udiff() 返回,因為它存在於 $b 中。
<?
$a = array(
array(
'id' => 10,
'name' => 'John',
'color' => 'red',
),
array(
'id' => 20,
'name' => 'Elise',
'顏色' => '藍色',
),
array(
'id' => 30,
'名稱' => 'Mark',
'color' => 'red',
),
);
$b = array(
array(
'id' => 15,
'名稱' => 'Nancy',
'顏色' => '黑色',
),
array(
'id' => 20,
'name' => 'Elise',
'顏色' => '藍色',
),
array(
'id' => 30,
'名稱' => 'Mark',
'color' => 'red',
),
array(
'id' => 40,
'name' => 'John',
'顏色' => '橘色',
),
);
function compare_ids($a, $b)
{
return ($a['id'] - $b['id']);
}
function compare_names($a, $b)
{
return strcmp($a['name'], $b['name']);
}
$ret = array_udiff($a, $b, 'compare_ids');
var_dump($ret);
$ret = array_udiff($b, $a, 'compare_ids');
var_dump($ret);
$ret = array_udiff($a, $b, 'compare_names');
var_dump($ret);
?>
會返回以下結果。
在第一個回傳值中,我們看到 $b 中沒有 id 為 10 的項目。
<?
array(1) {
[0]=>
array(3) {
["id"]=>
int(10)
["名稱"]=>
string(4) "John"
["顏色"]=>
string(3) "紅色"
}
}
?>
在第二個回傳值中,我們看到 $a 中沒有 id 為 15 或 40 的項目。
<?
array(2) {
[0]=>
array(3) {
["id"]=>
int(15)
["名稱"]=>
string(5) "Nancy"
["顏色"]=>
string(5) "黑色"
}
[3]=>
array(3) {
["id"]=>
int(40)
["名稱"]=>
string(4) "John"
["顏色"]=>
string(6) "橘色"
}
}
?>
在第三個回傳值中,我們看到 $a 中的所有名稱都存在於 $b 中(即使 $b 中名稱為 'John' 的項目不同,匿名函式也只比較名稱)。
<?
array(0) {
}
?>