Гарантирован ли порядок ассоциативного массива в PHP? - PullRequest
11 голосов
/ 04 июня 2009

Когда я выполняю цикл foreach над ассоциативным массивом в 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?

Ответы [ 4 ]

20 голосов
/ 04 июня 2009

Из Руководства PHP

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

и

Массивы упорядочены. Заказ может быть изменено с использованием различной сортировки функции.

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

1 голос
/ 04 июня 2009

Ваши вопросы выглядят так, будто вы пришли из программирования на Perl, где «массивы» не обязательно будут в том порядке, в котором вы их создали. Но в PHP он всегда был упорядочен и будет всегда, иначе большой код сломается.

1 голос
/ 04 июня 2009

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

0 голосов
/ 04 июня 2009

Это никогда не изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...