Каковы практические различия между «ассоциированными» и «проиндексированными» массивами в PHP? - PullRequest
7 голосов
/ 25 августа 2009

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

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 25 августа 2009

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

3 голосов
/ 25 августа 2009

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

3 голосов
/ 25 августа 2009

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

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

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

2 голосов
/ 20 февраля 2013

Одно интересное отличие, которое я обнаружил, это использование 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]
0 голосов
/ 25 августа 2009

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

...