Каковы практические различия между" ассоциированными "и" индексированными " массивами в 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
вариации в зависимости от того, хотите ли вы сохранить ключевые ассоциации и так далее).