2009-08-25 4 views
7

Тип массива PHP на самом деле больше похож на упорядоченную карту, чем на традиционный массив C. Это исходная структура данных общего использования PHP. В руководстве говорится, что можно сказать The indexed and associative array types are the same type in PHP, which can both contain integer and string indices.Каковы практические различия между «ассоциированными» и «индексированными» массивами в PHP?

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

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

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

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

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

ответ

3

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

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

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

+1

+1 для получения дополнительной информации, но следует отметить, что вы можете перебрать как индексированный массив, так и ассоциированный массив с помощью следующей функции(). Другими словами, ассоциативные массивы по-прежнему имеют некоторую внутреннюю концепцию порядка. –

+1

Истинно, и по этим линиям индексированный массив не обязательно имеет ожидаемый порядок - скорее, порядок, который использует массив (с 'foreach' или' next() ', разумеется) зависит от того, , поэтому, если $ arr [3] был установлен до $ arr [2], этот порядок будет сохранен при повторении. –

0

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

5

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

+0

+1 для различия между кодом реализации и пользовательского кода. Это информация о пользователе, которая мне интересна. –

3

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

+2

+1 для информации, но помните, что стандартные объекты библиотеки PHP Library не будут совместимы с существующими функциями массива PHP, что может раздражать старые руки. –

2

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