Каковы практические различия между ассоциированными и индексированными массивами в PHP?

Тип массива PHP на самом деле больше похож на упорядоченную карту, чем на традиционный массив C. Это исходная структура данных общего использования PHP. В руководстве говорится, что типы индексированных и ассоциативных массивов одинаковы. введите в PHP, который может содержать как целочисленные, так и строковые индексы.

Однако во многих случаях встроенные функции языка будут различать индексированные массивы (массивы с последовательными целочисленными ключами) и ассоциативные массивы (массивы с непоследовательными ключами и/или ключами смешанного типа).

Одним из примеров этого является функция array_merge.

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

Если задан только один массив, и массив проиндексирован в числовом виде, ключи непрерывно переиндексируются.

В каких еще местах PHP проводится различие между индексированными и ассоциативными массивами? Меня особенно интересуют различия между пользователями, хотя любое понимание реализации массива в исходном коде PHP также было бы интересно.


person Alan Storm    schedule 25.08.2009    source источник


Ответы (5)


Наиболее распространенный из них, который приходит на ум, заключается в том, что индексированный массив может быть зациклен с использованием традиционного цикла for, тогда как ассоциативный не может (потому что он не имеет числовых индексов):

for ($i = 0; $i < count($indexed_array); $i++)
{
  // do something with $indexed_array[$i]
}

Конечно, в php также есть ключевое слово foreach, которое работает одинаково для обоих типов.

person Daniel Vandersluis    schedule 25.08.2009
comment
+1 за хорошую информацию, но следует отметить, что вы можете перебирать как индексированный массив, так и ассоциированный массив, используя функцию next(). Другими словами, ассоциативные массивы по-прежнему имеют некоторую внутреннюю концепцию порядка. - person Alan Storm; 25.08.2009
comment
Верно, и в соответствии с этим индексированный массив не обязательно имеет ожидаемый порядок — скорее, порядок, который использует массив (с foreach или next(), заметьте), зависит от порядка, в котором он был заполнен, поэтому, если $arr[ 3] был установлен до $arr[2], этот порядок будет сохранен при повторении. - person Daniel Vandersluis; 26.08.2009

На самом деле, любой массив, независимо от того, индексированный он или ассоциативный, представляет собой хеш-таблицу (плюс двусвязный список для сохранения порядка элементов) в PHP. Однако в пользовательском PHP-коде индексированные и ассоциативные массивы почти всегда служат разным целям и иногда должны обрабатываться по-разному, поэтому некоторые функции, такие как sort/asort, делают различие между ними просто для удобства.

person Ignas R    schedule 25.08.2009
comment
+1 за различие между реализацией и пользовательским кодом. Меня интересуют пользовательские материалы. - person Alan Storm; 25.08.2009

.. а еще есть SplFixedArray, начиная с 5.3, поддерживает только целочисленные индексы, имеет фиксированный размер и, как правило, быстрее, чем собственные массивы.

person Anti Veeranna    schedule 25.08.2009
comment
+1 за информацию, но помните, что объекты массива стандартной библиотеки PHP не будут совместимы с существующими функциями массива PHP, что может раздражать опытных пользователей. - person Alan Storm; 25.08.2009

Одно интересное отличие, которое я обнаружил, заключается в использовании json_encode.

json_encode(array(0=>0,1=>1,2=>2));
> [0,1,2]
json_encode(array(0=>0,2=>2));
> {"0":0,"2":2}

В качестве отдельного примера это имеет смысл, но еще более удивительно в сочетании, скажем, с array_filter.

$f = function($x) { return $x != 1; };
json_encode(array_filter(array(0,1,2), $f));
> {"0":0,"2":2}

Мы начали с числового массива, отфильтровали некоторые элементы, но получившийся json — это ассоциативный массив!


Обратите внимание, что мы можем получить желаемый json, используя array_values.

json_encode(array_values(array_filter(array(0,1,2),$f)));
> [0,2]
person ceyko    schedule 20.02.2013

Практически все основные функции сортировки (со всеми вариациями sort, ksort, asort в зависимости от того, хотите ли вы сохранить ассоциацию ключей и т. д.).

person chaos    schedule 25.08.2009