Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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


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

Это потому, что теоретически разработчики могли бы выбрать себе возможность изменить реализацию в будущем, чтобы она больше не соблюдала существующий порядок (возможно, для повышения производительности или для получения другой выгоды).суб >

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

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

Ответ 2

Если вы обеспокоены, вы всегда можете выбрать один из них как правильный порядок, а затем переопределить другую функцию на основе этого. И если вы заботитесь о согласованности между двумя вызовами, вы, вероятно, собираетесь одновременно называть как array_keys, так и array_values. Так почему бы не сделать оба одновременно? Например, предположим, что порядок array_keys() является "правильным". Затем выполните:

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

Таким образом, вы знаете, что они находятся в одном порядке. В качестве альтернативы вы можете указать ключи для использования в качестве порядка:

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