PHP数组比较算法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

在试图模拟一些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,但代码似乎有工作的手册描述。

这里发生了什么?

提问于
用户回答回答于

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

换一种说法;

$ a> $ b循环遍历b并首先找到'test'。“测试”在$ b中更大,所以$ b更大,并且返回false。

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

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

用户回答回答于

我不是100%确定我是对的; 我之前没有见过这种情况,只是简单地对它进行了一番调查(顺便提一下,这是一个很棒的问题!)。无论如何,这似乎是PHP的文档是错误的,或者这是一个错误(在这种情况下,你可能想提交它),这是为什么:

zend_hash_compare()zend_hash.c,却仿佛有什么过一些混乱ordered的(我看行15141552-1561,这是我最好的猜测是哪里出了问题,没有做大量的测试)。

这就是我的意思; 尝试这个:

$a=array(0 => 2, 'test' => 2);
$b=array(0 => 1, 'test' => 3);
var_dump($a==$b, $a>$b, $b>$a);

注意我只是切换了索引的顺序,然后$a>$b返回true。另请参阅:

$x=array(0 => 2, 'test' => 2);
$y = $x;
$y[0] = 1; $y['test'] = 3;
var_dump($x==$y, $x>$y, $y>$x);

这里还要注意,$x>$y返回true。换句话说,PHP是不是只是相同排列的键!它关心数组中这些键的顺序!在修改之前,你可以通过提出“基本”数组并将其“复制”为新变量(在我的x / y示例中)来防止这种情况发生,或者如果你愿意,可以创建一个对象。

要说得有所不同,并且更简单一些,看起来似乎PHP不仅仅关注关键值,而且还关注关键值和关键顺序

再一次,我强调我不知道这个预期的行为(它看起来像是他们应该在PHP手册中注意到的),或者是一个错误/错误/等等(这对我来说更可能)。但无论哪种方式,我发现,它首先由键(行数相比1496-1501zend_hash.c),然后通过两个键值和按键的顺序。

扫码关注云+社区