Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Максимальная длина ключа ассоциативного массива
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Максимальная длина ключа ассоциативного массива

Страниц (1): [1]
 

1. armancho7777777 - 02 Апреля, 2012 - 03:00:03 - перейти к сообщению
Всем привет!
Какая допускается максимальная длина ключа ассоциативного массива,
и допускаются ли ключи вида ниже ?
PHP:
скопировать код в буфер обмена
  1. '/раздел_1/раздел_1.2/раздел_1.2.3/раздел_1.2.3.4/раздел_1.2.3.4.5/раздел_1.2.3.4.5.6/' => 'Раздел 1.2.3.4.5.6'
  2. );
2. DeepVarvar - 02 Апреля, 2012 - 04:46:15 - перейти к сообщению
Да, допускается. Ассоциативный ключ, это в любом случае строка.
Так же допустимы экранирование, конкатенация и пр. действия со строками.

Кроме того, любой ключ, даже числовой, интерпретатор php рассматривает как строку.
Т.е.:
PHP:
скопировать код в буфер обмена
  1. $arr = array();
  2.  
  3. $arr[0] = "aaa";
  4. $arr['0'] = "bbb";
  5.  
  6. var_dump($arr);


Что же касается ограничения длины я не знаю,
но у меня влезали строки до 1000 символов.
3. armancho7777777 - 02 Апреля, 2012 - 05:45:49 - перейти к сообщению
DeepVarvar пишет:
у меня влезали строки до 1000 символов.

Ооо, мне за глаза хватит))
Спасибо DeepVarvar!)
4. Гость - 30 Мая, 2012 - 14:55:47 - перейти к сообщению
В PHP индексом массива может быть не только число, но и строка. Причем на такую строку не накладываются никакие ограничения: она может содержать пробелы, длина такой строки может быть любой.
Источник: http://php.su/learnphp/datatypes/?array
5. EuGen - 30 Мая, 2012 - 14:56:35 - перейти к сообщению
armancho7777777
Максимальная длина - ограничение по памяти, выделенное скрипту.
6. caballero - 30 Мая, 2012 - 15:06:30 - перейти к сообщению
Лично я в подобных случаях использовал бы хеширование строки.
7. Bio man - 30 Мая, 2012 - 15:12:42 - перейти к сообщению
caballero
а если нужно работать с ключами и их смыслом? Тоже хэширование? Или шифрование?
8. EuGen - 30 Мая, 2012 - 15:19:00 - перейти к сообщению
Bio man
Выше верную идею предлагают. Если нужен поиск по некотой строке, которая представляет собой несколько мегабайт данных, то гораздо разумнее хранить, например, её md5-хеш в качестве ключа. Хотя в целом мне сложно представить ситуацию, когда потребуются такие "ключи".
9. Bio man - 30 Мая, 2012 - 15:30:09 - перейти к сообщению
EuGen
В таком случае да. Но если ключ это оочень длинная строка ~1000 символов, и нужно извлечь ее и с ней работать то не о каком хешировании не может быть речи.
Но представить ситуацию, когда это надо не могу.
10. tuareg - 30 Мая, 2012 - 16:28:34 - перейти к сообщению
Bio man пишет:
EuGen
В таком случае да. Но если ключ это оочень длинная строка ~1000 символов, и нужно извлечь ее и с ней работать то не о каком хешировании не может быть речи.
Но представить ситуацию, когда это надо не могу.

Bio man Зачем вот смотри. Есть "предполагаемый" массив
PHP:
скопировать код в буфер обмена
  1.  
  2. $array=array();
  3. $array['тут длинный ключ']='какое-то значение';
  4. /*count($array)=10000*/
  5.  

Как хранятся массивы( ключи) можно прочитать на хабре коротко $array['key']-->hash таблица
Идем дальше. Улыбка
Зачем нам это?
Можно сделать проще:
Ключом сделать hash
А первым элементом истинное значение, тогда получится следующее
PHP:
скопировать код в буфер обмена
  1.  
  2. $text='длинная строка'
  3. $key=md5($text);
  4. $array=array();
  5. $array[$key]=array(
  6.  'original':$text // мало ли коллизия и т.д
  7. )
  8.  

Найти данный элемент будет очень просто и быстро
11. DeepVarvar - 30 Мая, 2012 - 16:46:23 - перейти к сообщению
Я пилил себе кеш запросов в БД от кривых рук (и своих тоже Радость ).
Суть в том что готовый отэкранированый запрос это ключ в массиве запросов,
а его значение это результат запроса.
Кешируется только на момент выполнения, никуда не сбрасывается.
Кроме того есть отдельные методы вида: queryWithCache и queryWithOutCache.
Соответственно если дергается кешируемый запрос, он сперва ищется в кеше,
если его там нет, делается запрос и его результат помещается в кеш.
Хеш я не делал, не особо длинная строка. Хотя можно будет и добавить.

Такие вещи нужны не часто, но бывает что требуется. Во всяком случае мне так удобно.
12. armancho7777777 - 30 Мая, 2012 - 17:16:50 - перейти к сообщению
EuGen пишет:
armancho7777777
Максимальная длина - ограничение по памяти, выделенное скрипту.

Спасибо EuGen!)
13. caballero - 30 Мая, 2012 - 17:27:22 - перейти к сообщению
Bio man пишет:
а если нужно работать с ключами и их смыслом? Тоже хэширование? Или шифрование?

не нужно будет если не говнокодить.
у ключей обычно не бывает смысла.

 

Powered by ExBB FM 1.0 RC1