Как PHP отслеживает порядок в ассоциативном массиве? - PullRequest
9 голосов
/ 16 марта 2011

При вставке нового значения в индексированный массив

$array[] = 'new value';

в документации PHP объясняется, как оно добавляется в позицию [MAX_INDEX + 1].

При вставке нового значения вассоциативный массив

$array['key'] = 'new value';

работает так же, но я не вижу в документации никакого объяснения, чтобы подтвердить, как и почему это происходит.Похоже, что порядок в моей реализации согласован, но откуда мне знать, что порядок останется прежним?Кто-нибудь знает, как PHP реализует это на сервере?

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

MAX_INDEX на самом деле не имеет ничего общего с заказом.
вы можете сделать

$array[5] = 'new value';
$array[1] = 'new value';
$array[105] = 'new value';
$array[2] = 'new value';

и массив также сохранит этот порядок.

Массив PHP - это упорядоченная карта, так что это карта, которая сохраняет свой порядок.
элементы массива просто следят за порядком, так как они были добавлены (или он был полностью изменен некоторой функцией манипулирования массивом).
это все.

0 голосов
/ 27 марта 2018

Все массивы PHP, числовые и ассоциативные, реализованы в виде так называемой «упорядоченной хэш-таблицы».Это термин науки о данных, который означает: «Разумное быстрое хранилище значений ключей, которое отслеживает порядок, в котором ключи и значения были вставлены».Другими словами, массивы PHP имеют немного памяти для запоминания порядка.Каждый раз, когда вы помещаете что-то в это, PHP автоматически помещает туда и порядок.

Интересно, что это происходит и с цифровыми клавишами, так что если вы поместите значения 1,2,3,4,5 вмассив PHP, PHP по-прежнему отдельно отслеживает порядок.Если это звучит расточительно, это потому, что это так!Это, однако, сохраняет мозговые циклы, которые могут быть использованы для решения других проблем людей, реальных и воображаемых.

0 голосов
/ 16 марта 2011

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

Кажется, что PHP-массивы по сути являются хеш-таблицами, поэтому порядок массива останется неизменным до тех пор, покаВы переупорядочиваете его (например, путем сортировки массива).

РЕДАКТИРОВАТЬ: Похоже, что это становится недооцененным, позвольте мне явно включить источники, с которыми я связан в комментарии ниже здесь ...

  • "Ассоциативные массивы PHP на самом деле являются реализацией HashTables", из Как массив PHP реализован на уровне C?

  • Также из этого источника: «Массив PHP представляет собой цепочечную хеш-таблицу (поиск O (c) и O (n) при столкновениях ключей), которая позволяет использовать ключи типа int и string. Он использует 2 различных алгоритма хеширования дляпоместите два типа в одно и то же пространство хеш-ключей. "

  • " Все является хеш-таблицей "от http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

0 голосов
/ 16 марта 2011

Я предпочитаю полагаться на ksort .По моему опыту, массивы остаются последовательными, пока вы не начнете удалять элементы.Лучше сортировать их вручную и знать, что они в нужном вам порядке.

...