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

心配な場合は、いつでも正しい順序として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;
}
于 2015-02-20T16:03:22.257 に答える