Вопрос по php – Порядок ключей, возвращаемых из array_keys, совпадает с порядком во входном массиве?

22

Учитывая ассоциативный массив, подобный следующему,

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

могу ли я положиться наarray_keys() вернуть ключи в том порядке, в котором они были указаны? Или, точнее, поскольку массивы в PHP, кажется, имеют стабильный порядок в соответствии сэтот ответключи возвращеныarray_keys() в том же порядке, как они появляются во входном массиве?страница справочника не дает никаких подсказок.

Когда я попробую это, ониseem уважать первоначальный порядок, но я хотел бы иметь возможность полагаться на такое поведение.

Ваш Ответ

2   ответа
34

TL; DR. Теоретически вы не можете рассчитывать на это; для практических целей ИМО можно.


Поскольку документы не гарантируют порядок, технически правильный ответ будет "нет, вы не можете" рассчитывать на это ".

That's because theoretically the developers could have chosen to reserve themselves the option of changing the implementation at a future date so that it does not honor the existing order any more (perhaps to improve performance, or to gain some other benefit).

Теперь какpractical важно, мы знаем, чтотекущая реализация соблюдает порядок - Массивы PHP - это упорядоченные контейнеры (среди прочего, есть связанный список значений), и это то, что вы никогда не ожидаете изменить.

Если это произойдет, это изменение будет означать соответствующее значительное изменение внутренней реализации массивов, что, в свою очередь, также может привести к поломке большого количества другого кода. Я не вижу, что это произойдет в ближайшее время.

Прочитайте источник, Люк. Hanno Fietz
+1 для OpenGrok
2

Если вас это беспокоит, вы всегда можете выбрать один из них в качестве правильного порядка, а затем переопределить другую функцию, основываясь на этом. И если вы заботитесь о согласованности между двумя вызовами, вы, вероятно, собираетесь позвонить обоим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;
}

Похожие вопросы