PHP数组比较算法

在尝试模拟一些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);

所有三个比较结果都是假的。这对我来说看起来像“无法比拟”(因为>结果与< result相同,而数组不是==,这没有任何意义),但这不符合PHP手册的转录。这两个键都存在于这两个数组中,我期望这个时候会有更大的a,因为在$ a(2对1)中键0的内容更大。 我试图挖掘PHP源代码,并在zend_hash.c中找到了zend_hash_compare(),但代码看起来像手册所述。

这里发生了什么?

看来比较循环是在>的情况下通过右手阵列完成,完成在左手阵列,即总是超过所谓的“较小”的阵列。元素的顺序是重要的,因为转录代码中的foreach循环遵循数组顺序。

换一种说法;

$ a> $ b循环b并首先找到’test’。 ‘test’在$ b中更大,所以$ b更大,它返回false。

$ b> $ a循环并首先找到’0’。 $ a中的’0’更大,所以$ a更大,返回false。

这实际上是有意义的,然后允许“更大”数组包含“较小”数组不会并且仍然更大的元素,只要所有常见元素都更大。

http://stackoverflow.com/questions/8781744/php-array-comparison-algorithm

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:PHP数组比较算法