Le premier exemple :
$x = array("a" => 1, "b" => 2);
$y = array("b" => 1, "a" => 2);
$xLessY = ($x < $y);
$xGreaterY = ($x > $y);
var_dump($xLessY, $xGreaterY);
Résultat : $xLessY = vrai , $xGreaterY = vrai
Le deuxième exemple :
$x = array("a" => 2, "b" => 1);
$y = array("b" => 2, "a" => 1);
$xLessY = ($x < $y);
$xGreaterY = ($x > $y);
var_dump($xLessY, $xGreaterY);
Résultat : $xLessY = faux , $xGreaterY = faux
Selon la documentation sur http://docs.php.net/manual/en/language.operators.comparison.php :
si la clé de l'opérande 1 n'est pas trouvée dans l'opérande 2. l'opérande 2, les tableaux sont non comparables, sinon - comparer valeur par valeur
Dans notre cas, chaque clé du tableau $x est présente dans le tableau $y, donc $x et $y sont comparables. Voir aussi l'exemple de la documentation :
// Arrays are compared like this with standard comparison operators
function standard_array_compare($op1, $op2)
{
if (count($op1) < count($op2)) {
return -1; // $op1 < $op2
} elseif (count($op1) > count($op2)) {
return 1; // $op1 > $op2
}
foreach ($op1 as $key => $val) {
if (!array_key_exists($key, $op2)) {
return null; // uncomparable
} elseif ($val < $op2[$key]) {
return -1;
} elseif ($val > $op2[$key]) {
return 1;
}
}
return 0; // $op1 == $op2
}
Ce comportement est vraiment étrange : $x est inférieur à $y et en même temps $x est supérieur à $y (le premier exemple) et deux tableaux sont comparables.
Je pense que c'est parce que php compare toujours en commençant par le côté défini du signe '<'. Je veux dire : pour ($x < $y) php prend $x comme opérande 1, pour ($x > $y) il prend $y comme opérande 1. Bien que je n'ai rien trouvé sur ce comportement dans la documentation.
Qu'en pensez-vous ?