Символы, разрешенные в ключах php-массива?

У меня есть несколько ключей массива php, которые заполнены множеством странных символов.

Это разрешено? Существуют ли какие-либо ограничения на то, что я не могу использовать?

Согласно руководству :

Ключ может быть целым числом или строкой. Значение может быть любого типа.

Кроме того, будут выполняться следующие нажатия клавиш:

  • Строки, содержащие действительные целые числа, будут переданы в целочисленный тип. Например, ключ «8» будет фактически сохранен под 8. С другой стороны, «08» не будет выбрано, так как это не допустимое целое число.
  • Поплавки также отливаются от целых чисел, что означает, что дробная часть будет усечена. Например, ключ 8.7 будет фактически сохранен под 8.
  • Bools также отлиты от целых чисел, т. Е. Ключ true будет фактически сохранен под 1 и ключ false под 0.
  • Null будет передан в пустую строку, т. Е. Нулевой ключ будет фактически сохранен под "".
  • Массивы и объекты не могут использоваться в качестве ключей. Это приведет к предупреждению: тип недопустимого смещения.

Руководство снова :

Строка представляет собой последовательность символов, где символ совпадает с символом. Это означает, что PHP поддерживает только 256-символьный набор и, следовательно, не предлагает поддержку родного Unicode. Подробнее о типе строки.

Короче говоря, любая строка может быть ключом. И строка может содержать любые двоичные данные (до 2 ГБ). Таким образом, ключ может быть любым двоичным данным (поскольку строка может быть любыми двоичными данными).

Некоторые случайные (действительные) злоупотребления ключами массива:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?'); var_dump($w); 

Ключ должен быть строкой или целым числом. Есть несколько отливок, которые имеют место, но я думаю, что руководство действительно помогает объяснить:

Ключ может быть целым числом или строкой. Значение может быть любого типа.

Кроме того, будут выполняться следующие нажатия клавиш:

  • Строки, содержащие действительные целые числа, будут переданы в целочисленный тип. Например, ключ «8» будет фактически сохранен под 8. С другой стороны, «08» не будет выбрано, так как это не допустимое целое число.
  • Поплавки также отливаются от целых чисел, что означает, что дробная часть будет усечена. Например, ключ 8.7 будет фактически сохранен под 8.
  • Bools также отлиты от целых чисел, т. Е. Ключ true будет фактически сохранен под 1 и ключ false под 0.
  • Null будет передан в пустую строку, т. Е. Нулевой ключ будет фактически сохранен под "".
  • Массивы и объекты не могут использоваться в качестве ключей. Это приведет к предупреждению: тип недопустимого смещения.

Я нашел этот ответ для поиска дополнительной информации о проблеме, которую я имел. Я использовал строки с символами UTF-8, которые не работали бы как ключи к массиву, который у меня был.

Что-то вроде

 $str = "R&D - Solution"; $arr = array( "R&D - Solution" => "Research" ); echo $arr[$str]; // did not work 

Для меня было (не большое или умное) решение сделать это ..

 $str = md5("R&D - Solution"); $arr = array( md5("R&D - Solution") => "Research" ); echo $arr[$str]; // works! 

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

 $a = array(); $x = 'long string of random garage'; echo $a[$x]; // this is ok $x = array(); echo $a[$x]; // not ok 

Ключи массива PHP могут быть целыми числами или строками. Строки PHP представляют собой байтовые массивы, означающие последовательности байтов. Других типов строк нет, и PHP иначе не накладывает никаких особых ограничений на строки ключей массива. Другими словами: до тех пор, пока это строка, все идет.

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

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