从array_keys返回的键的顺序是否与输入数组中的顺序相同?

时间:2012-04-26 15:17:19

标签: php

给定如下的关联数组

$field_defaults = array(
  'id' => 0,
  'name' => 'new item',
  'desc' => '',
  'parent_id' => 0,
);

我可以依赖array_keys()按照指定的顺序返回密钥吗?或者,更准确地说,由于PHP中的数组似乎具有稳定的顺序,按照this answerarray_keys()返回的键的顺序与它们在输入数组中出现的顺序相同? manual page没有提供任何提示。

当我尝试这个时,他们似乎尊重原始订单,但我希望能够依赖这种行为。

2 个答案:

答案 0 :(得分:34)

TL; DR:从理论上讲,你不能指望它;出于实际目的,你可以IMO。


由于文档不保证订购,因此从技术上讲,正确答案是“不,你不能指望”。

这是因为从理论上讲,开发人员可以选择保留自己在未来更改实施的选项,以便它不再遵守现有订单(可能是为了提高性能,或者获得其他一些好处) )。

现在作为实际的问题,我们知道the current implementation honors the ordering - PHP数组是有序容器(除了其他东西之外还有一个值的链接列表) - 这就是你的意思不会期望改变。

如果确实如此,该更改将暗示数组的内部实现中的相应重大更改,并且反过来也可能会破坏许多其他代码。我不认为它会很快发生。

答案 1 :(得分:2)

如果您担心,您可以随时选择一个作为正确的顺序,然后根据该功能重新实现其他功能。如果您关心两个呼叫之间的一致性,您可能会同时呼叫array_keysarray_values。那么为什么不同时做两个呢?例如,我们假设array_keys()的顺序是“正确的”。然后做:

function arrayKV($arr) {
    $keys = array_keys($arr);
    $values = array();
    foreach($keys as $key) {
        $values[] = $arr[$key];
    }
    return array('keys' => $keys, 'values' => $values);
}

这样,你知道他们的顺序是一样的。或者,您可以提供用作订单的密钥:

function arrayValuesStable($arr, $keys) {
    $values = array();
    foreach($keys as $key) {
        $values[] = $arr[$key];
    }
    return $values;
}