在尝试模拟一些 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
更大,因为在$a
中键名为0的值更大(分别是2和1)。
我已经尝试查看了PHP源代码,并在zend_hash.c
中找到了zend_hash_compare(),但那里的代码似乎与手册描述的一样。
这里到底发生了什么?
$a=array(0 => 2, 'test' => 2); $b=array('test' => 3, 0 => 1); $r = standard_array_compare($a, $b); // c/p from manual var_dump( $r );
结果:int(1)
这应该在https://bugs.php.net/上报告。 - DamirR