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

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

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

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

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

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


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

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

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

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

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