29

给定一个如下的关联数组,

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

我可以依靠按array_keys()指定顺序返回密钥吗?或者,更准确地说,由于 PHP 中的数组似乎有一个稳定的顺序,根据这个答案,返回的键是否array_keys()与它们在输入数组中出现的顺序相同?手册页没有给出任何提示。

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

4

2 回答 2

42

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


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

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

现在作为一个实际问题,我们知道当前的实现尊重排序——PHP 数组是有序的容器(除其他外,还有一个值的链接列表)——这是你永远不会期望改变的。

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

于 2012-04-26T15:18:48.040 回答
3

如果您担心,您总是可以选择一个作为正确的顺序,然后根据该顺序重新实现另一个功能。如果您关心两个调用之间的一致性,您可能会同时调用这两个array_keys调用array_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;
}
于 2015-02-20T16:03:22.257 回答