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

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

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

одним из примеров этого является array_merge

5 ответов


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

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

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


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


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


одно интересное отличие, которое я нашел, - это использование 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]

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