Каков максимальный размер ключа для массива в PHP?

Я создаю ассоциативные массивы, а значение ключа - это строка, состоящая из 1..n столбцов.

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

Хорошая иллюстрация RoBorg, если у меня будет ключ больше 128mb, я, наверное, попаду на ежедневный WTF. Большое спасибо.

Ross 22.01.2009 16:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
69
1
46 769
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В PHP нет практических ограничений на размер строки. Согласно руководство:

Note: It is no problem for a string to become very large. PHP imposes no boundary on the size of a string; the only limit is the available memory of the computer on which PHP is running.

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

Ответ принят как подходящий

Вроде ограничивается только лимитом памяти скрипта.

Быстрый тест дал мне ключ на 128 МБ без проблем:

ini_set('memory_limit', '1024M');

$key = str_repeat('x', 1024 * 1024 * 128);

$foo = array($key => $key);

echo strlen(key($foo)) . "<br>";
echo strlen($foo[$key]) . "<br>";

ой! ну, мне, конечно, не нужно беспокоиться о том, что мои ключи будут немного превышать 255 символов.

thomasrutter 05.05.2009 08:51

Имейте в виду, что PHP может быть не единственным ограничивающим фактором для размера ключа. Например, memcache может обрезать ключи из $ _SESSION, если они слишком длинные.

jchook 30.09.2016 23:39

В zend_hash.h вы можете найти метод zend_inline_hash_func(), который может показать, как хешировать строку ключа в PHP, поэтому используйте ключ, длина строки которого меньше 8 символов, лучше для производительности.

static inline ulong zend_inline_hash_func(char *arKey, uint nKeyLength) {

register ulong hash = 5381;

/* variant with the hash unrolled eight times */
for (; nKeyLength >= 8; nKeyLength -= 8) {
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
    hash = ((hash << 5) + hash) + *arKey++;
}
switch (nKeyLength) {
    case 7: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 6: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 5: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 4: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 3: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 2: hash = ((hash << 5) + hash) + *arKey++; /* fallthrough... */
    case 1: hash = ((hash << 5) + hash) + *arKey++; break;
    case 0: break;  EMPTY_SWITCH_DEFAULT_CASE()
}
    return hash;   
}

Другие вопросы по теме