Note that php does the string conversion *before* sending the values to the callback function.
array_udiff
(PHP 5)
array_udiff — Calcule la différence entre deux tableaux en utilisant une fonction rappel
Description
Calcule la différence entre deux tableaux en utilisant une fonction rappel. Cette fonctionne agit comme la fonction array_diff() qui utilise une fonction interne pour comparer les données.
Liste de paramètres
- array1
-
Le premier tableau.
- array2
-
Le second tableau.
- data_compare_func
-
La fonction de comparaison.
La fonction utilisateur de rappel est utilisée pour la comparaison. Elle doit retourner un entier plus petit que, égal à, ou plus grand que zéro si le premier argument est respectivement plus petit que, égal au, ou plus grand que le second.
Valeurs de retour
Retourne un tableau contenant toutes les valeurs du tableau array1 qui ne sont pas présentes dans aucun autre argument.
Exemples
Exemple #1 Exemple avec array_udiff()
<?php
class cr {
private $priv_member;
function cr($val)
{
$this->priv_member = $val;
}
static 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);
?>
L'exemple ci-dessus va afficher :
Array
(
[0.5] => cr Object
(
[priv_member:private] => 12
)
[0] => cr Object
(
[priv_member:private] => 23
)
)
Notes
Note: Notez que cette fonction ne vérifie qu'une seule dimension d'un tableau multidimensionnel. Vous pouvez, bien sûr, tester une dimension particulière en utilisant par exemple array_udiff($array1[0], $array2[0], "data_compare_func");.
Voir aussi
- array_diff() - Calcule la différence entre deux tableaux
- array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
- array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
- array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
- array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
- array_intersect() - Calcule l'intersection de tableaux
- array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
- array_uintersect() - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
- array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les donnée en utilisant une fonction de rappel
- array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les indexes des deux tableaux en utilisant une fonction de rappel
array_udiff
07-Jul-2009 07:27
08-Oct-2008 01:51
It is not stated, by this function also diffs array1 to itself, removing any duplicate values...
31-Dec-2007 03:15
Re: "convoluted"
I think the point being made is that array_udiff() can be used not only for comparisons between homogenous arrays, as in your example (and definitely the most common need), but it can be used to compare heterogeneous arrays, too.
Consider:
<?php
function compr_1($a, $b) {
$aVal = is_array($a) ? $a['last_name'] : $a;
$bVal = is_array($b) ? $b['last_name'] : $b;
return strcasecmp($aVal, $bVal);
}
$aEmployees = array(
array('last_name' => 'Smith',
'first_name' => 'Joe',
'phone' => '555-1000'),
array('last_name' => 'Doe',
'first_name' => 'John',
'phone' => '555-2000'),
array('last_name' => 'Flagg',
'first_name' => 'Randall',
'phone' => '666-1000')
);
$aNames = array('Doe', 'Smith', 'Johnson');
$result = array_udiff($aEmployees, $aNames, "compr_1");
print_r($result);
?>
Allowing me to get the "employee" that's not in the name list:
Array ( [2] => Array ( [last_name] => Flagg [first_name] => Randall [phone] => 666-1000 ) )
Something interesting to note, is that the two arguments to the compare function don't correspond to array1 and array2. That's why there has to be logic in it to handle that either of the arguments might be pointing to the more complex employee array. (Found this out the hard way.)
02-Aug-2006 08:15
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) {
}
?>
20-Jan-2005 09: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 02: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
