Допустимые символы в ключах массива 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, что они являются своего рода правилами между лучшими программистами для того, чтобы иметь хороший и стандартный стиль кодирования.