Когда я выполняю цикл foreach над массивом associatve в php, порядок, в котором он выполняется, – это порядок, в котором он определен.
Например:
$arr = array("z" => "z", "a" => "a", "b" => "b"); foreach($arr as $key => val) print("$key: $val\n");
Выходы:
z: z a: a b: b
В то время как
$arr = array("a" => "a", "b" => "b", "z" => "z");
Выходы:
a: a b: b z: z
Поэтому мой вопрос заключается в следующем: это поведение определено на уровне спецификации? Могу ли я иметь разумную уверенность в том, что это поведение не будет изменено в будущих версиях PHP?
Из руководства по PHP
Массив в PHP на самом деле является упорядоченной картой. Карта – это тип, который связывает значения с ключами. Этот тип оптимизирован для нескольких различных применений; он может рассматриваться как массив, список (вектор), хеш-таблица (реализация карты), словарь, коллекция, стек, очередь и, возможно, больше.
а также
Массивы упорядочены. Заказ можно изменить с помощью различных функций сортировки.
Поэтому вы можете быть уверены (по крайней мере в настоящее время), что заказ будет сохранен. Я был бы очень удивлен, если бы это поведение изменилось, потому что оно четко указано, и из-за этого будет огромное количество кода, который опирается на него.
Это никогда не изменится.
Поскольку массивы всегда упорядочены, а самый простой и быстрый способ итерации массива – переход от первого элемента к последнему (поэтому нет веских оснований для изменения поведения foreach ()), вы можете быть достаточно уверены, что это поведение не изменится.
Ваши вопросы выглядят так, как будто вы пришли из программирования на Perl, где «массивы» не гарантированы в том порядке, в котором вы их создали. Но в PHP он всегда был заказан и всегда будет, иначе много кода сломается.