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

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

$array[] = 'new value';

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

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

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

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

Ответ 1

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

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

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

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

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

  • "Все есть HashTable" из http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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