При попытке имитировать немного поведения PHP я наткнулся на это:
$a=array(0 => 1, 'test' => 2);
$b=array('test' => 3, 0 => 1);
var_dump($a==$b, $a>$b, $b>$a);
В соответствии с выходом var_dump $b больше, чем $a. В руководстве по PHP есть Транскрипция сравнения стандартных массивов, в которой указано, что значения массивов сравниваются по одному и если ключ из первый массив отсутствует во втором массиве, массивы несравнимы. Все идет нормально. Но если я попробую это (изменение только в первом элементе $a):
$a=array(0 => 2, 'test' => 2);
$b=array('test' => 3, 0 => 1);
var_dump($a==$b, $a>$b, $b>$a);
Все три результата сравнения false. Это выглядит как "несравнимое" для меня (поскольку результат > совпадает с результатом <, тогда как массивы не являются ==, что не имеет смысла), но это не соответствует транскрипции из PHP руководство. Оба ключа присутствуют в обоих массивах, и я ожидал бы, что $a будет больше на этот раз, потому что содержимое ключа 0 больше в $a (2 против 1).
Я попытался вникнуть в исходный код PHP и нашел zend_hash_compare() в zend_hash.c, но код там, похоже, работает как описано в руководстве.
Что здесь происходит?