我认为这里用类给出的例子过于复杂,无法演示此函数的功能。
array_udiff() 将遍历 array_values($a) 和 array_values($b),并使用传入的回调函数比较每个值。
换句话说,array_udiff() 使用提供的回调函数将 $a[0] 与 $b[0]、$b[1]、$b[2] 和 $b[3] 进行比较。如果回调函数对任何比较返回 0,则 $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',
'color' => 'blue',
),
array(
'id' => 30,
'name' => 'Mark',
'color' => 'red',
),
);
$b = array(
array(
'id' => 15,
'name' => 'Nancy',
'color' => 'black',
),
array(
'id' => 20,
'name' => 'Elise',
'color' => 'blue',
),
array(
'id' => 30,
'name' => 'Mark',
'color' => 'red',
),
array(
'id' => 40,
'name' => 'John',
'color' => 'orange',
),
);
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)
["name"]=>
string(4) "John"
["color"]=>
string(3) "red"
}
}
?>
在第二个返回值中,我们看到 $a 中没有 id 为 15 或 40 的条目。
<?
array(2) {
[0]=>
array(3) {
["id"]=>
int(15)
["name"]=>
string(5) "Nancy"
["color"]=>
string(5) "black"
}
[3]=>
array(3) {
["id"]=>
int(40)
["name"]=>
string(4) "John"
["color"]=>
string(6) "orange"
}
}
?>
在第三个返回值中,我们看到 $a 中的所有名称都存在于 $b 中(即使 $b 中名称为 'John' 的条目不同,匿名函数只比较名称)。
<?
array(0) {
}
?>