在尝试模拟一些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手册中有一个Transcription of standard array comparison,它说明数组的值是逐个比较的,如果第一个数组中的键在第二个数组中丢失了,那么这些数组就是不可比较的。到目前一切尚好。但如果我尝试这样做(仅在$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(),但那里的代码似乎可以像手册中描述的那样工作。
这里发生了什么事?
发布于 2012-01-09 06:34:08
似乎在>的情况下,比较循环是在右数组上完成的,而在<的情况下,比较循环是在左数组上完成的,即总是在假设的“较小”数组上。元素的顺序很重要,因为转录代码中的foreach循环遵循数组顺序。
换句话说,
测试遍历b并首先找到‘$a>$b’。$b中的“$b”较大,因此‘test较大,并返回false。
$b>$a在a上循环并首先找到'0‘。“0”在$a中较大,因此$a较大,并返回false。
这实际上是有意义的,“较大”数组被允许包含“较小”数组不包含的元素,并且只要所有公共元素都较大,该数组仍然较大。
发布于 2012-01-09 06:33:15
我认为这里是一个接一个地比较,所以$a[0]>$b[0]
和$a['test']<$b['test']
。你不能说哪个数组更大。
https://stackoverflow.com/questions/8781744
复制相似问题