Допустимые символы в ключах массива php?

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

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

12 ответов

Согласно инструкции:

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

Кроме того, произойдет следующее приведение ключей:

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

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

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

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

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

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

Я нашел этот ответ в поисках дополнительной информации о проблеме, которая у меня была. Я использовал строки с символами 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!

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

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

Кроме того, произойдет следующее приведение ключей:

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

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

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

$a = array();

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

$x = array();
echo $a[$x]; // not ok

Если сложные ключи вызывают ошибку "неопределенный индекс", у вас может просто возникнуть проблема "обрезки".

Я сходил с ума, потому что сложный ключ выплевывал ошибку "неопределенный индекс", и я подумал, что, возможно, это было нарушение синтаксиса. Ключ массива, вызвавший ошибку, был создан из поля из запроса к базе данных MySQL, который я преобразовывал в ключ и использовал в новом массиве. Ключ выглядел так: pl_1DNKoiJKwotCqAycickBVhTy и вот как код был построен.

//new array created from database query
$new_array[$dbquery['fieldname']] = {some value};

//key value found in field of second array
$keyval = $array_two['fieldname'];

//this produced the "undefined index" error
echo $new_array[$keyval];

когда, на самом деле, $keyval а также $dbquery['fieldname'] казалось, идеально подходит (визуально проверено, повторяя оба браузера). Тайна была решена простым использованием trim во втором утверждении, как это: $keyval = trim($array_two['fieldname']); После "обрезки" php больше не жаловался.

Надеясь, что это спасет некоторых других от некоторых неприятных моментов...

Для этого кода:

      $a = (object) ['@km³' => 123];

Этот :

      error_log($a->@km³);

Произведите эту ошибку:

      PHP Parse error: Syntax error, unexpected '@', expecting T_STRING or T_VARIABLE or '{' or '$' on line 1

Но это работает:

      error_log($a->{"@km³"});

{} )

В массиве php вы не можете использовать ключ: 2.3 или десятичные числа

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

      $sKey="C:\music\R&B - Stas mihailov.mp3";
$sKey=str_replace("&","_amp_",$sKey);//encode
$mArray[$sKey]="album name Сheeks Dance";
foreach($mArray as$sKey=>$v){
 $sKey=str_replace("_amp_","&",$sKey);//decode
 ..
    
 }

Кодировать страницу php в ANSI "é" можно будет использовать (Cinéma не будет отображаться как Cinéma). В Notepad++ просто используйте меню Encode=>Convert ANSI и сохраните

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

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