I think the example given here using classes is convoluting things too much to demonstrate what this function does.
array_udiff() will walk through array_values($a) and array_values($b) and compare each value by using the passed in callback function.
To put it another way, array_udiff() compares $a[0] to $b[0], $b[1], $b[2], and $b[3] using the provided callback function. If the callback returns zero for any of the comparisons then $a[0] will not be in the returned array from array_udiff(). It then compares $a[1] to $b[0], $b[1], $b[2], and $b[3]. Then, finally, $a[2] to $b[0], $b[1], $b[2], and $b[3].
For example, compare_ids($a[0], $b[0]) === -5 while compare_ids($a[1], $b[1]) === 0. Therefore, $a[1] is not returned from array_udiff() since it is present in $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);
?>
Which returns the following.
In the first return we see that $b has no entry in it with an id of 10.
<?
array(1) {
[0]=>
array(3) {
["id"]=>
int(10)
["name"]=>
string(4) "John"
["color"]=>
string(3) "red"
}
}
?>
In the second return we see that $a has no entry in it with an id of 15 or 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"
}
}
?>
In third return we see that all names in $a are in $b (even though the entry in $b whose name is 'John' is different, the anonymous function is only comparing names).
<?
array(0) {
}
?>
array_udiff
(PHP 5)
array_udiff — データの比較にコールバック関数を用い、配列の差を計算する
説明
array array_udiff ( array $array1, array $array2 [, array $ ..., callback $data_compare_func] )array_udiff() は、他の引数のいずれにも存在しない array1 の値の全てを有する配列を返します。 キーと値の関係は維持されることに注意してください。 データの比較には data_compare_func が用いられます。 この関数は、1 つめの引数が 2 つめより小さい / 等しい / 大きい 場合にそれぞれ 負の数 / ゼロ / 正の数 を返す必要があります。 この関数は array_diff() に似ていますが、こちらは データの比較に内部関数を利用します。
例 278. array_udiff() の例
<?php
class cr {
private $priv_member;
function cr($val)
{
$this->priv_member = $val;
}
function comp_func_cr($a, $b)
{
if ($a->priv_member === $b->priv_member) return 0;
return ($a->priv_member > $b->priv_member)? 1:-1;
}
}
$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23), 1=> new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr(3), 1=> new cr(4), 2 => new cr(-15),);
$result = array_udiff($a, $b, array("cr", "comp_func_cr"));
print_r($result);
?>
上の例の出力は以下となります。
Array
(
[0.5] => cr Object
(
[priv_member:private] => 12
)
[0] => cr Object
(
[priv_member:private] => 23
)
)
注意: この関数は n 次元配列の一つの次元しかチェックしないことに注意してください。 もちろん、array_udiff($array1[0], $array2[0], "data_compare_func"); のようにすることでより深い次元でのチェックもできます。
array_diff()、 array_diff_assoc()、 array_diff_uassoc()、 array_udiff_assoc()、 array_udiff_uassoc()、 array_intersect()、 array_intersect_assoc()、 array_uintersect()、 array_uintersect_assoc() および array_uintersect_uassoc() も参照ください。
array_udiff
03-Aug-2006 05:15
21-Jan-2005 06:44
Very easy way of achieving a case-insensitive version of array_diff (or indeed array_diff_assoc, array_intersect or any of these types of functions which have a similar function that takes a callback function as one of their parameters):
array_udiff($array1, $array2, 'strcasecmp');
This works because strcasecmp() compares two strings case-insensitively, as compared to the array_diff() which compares two strings by using the == operator, which is case-sensitive.
28-May-2004 11:11
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat