У меня есть ключи массива php, которые заполнены множеством странных символов.
Это разрешено? Есть ли какие-то ограничения на то, что я не могу использовать?
У меня есть ключи массива php, которые заполнены множеством странных символов.
Это разрешено? Есть ли какие-то ограничения на то, что я не могу использовать?
Ответы:
Согласно инструкции :
Ключ может быть целым числом или строкой. Значение может быть любого типа.
Кроме того, произойдут следующие преобразования клавиш:
- Строки, содержащие допустимые целые числа, будут преобразованы в целочисленный тип. Например, ключ «8» будет фактически сохранен под номером 8. С другой стороны, «08» не будет приведено, так как это недопустимое десятичное целое число.
- Плавающие числа также приводятся к целым числам, что означает, что дробная часть будет усечена. Например, ключ 8.7 будет фактически сохранен под номером 8.
- Булы также приводятся к целым числам, то есть ключ 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);
Ключ должен быть строкой или целым числом. Происходит несколько кастингов, но я думаю, что руководство хорошо объясняет:
Ключ может быть целым числом или строкой. Значение может быть любого типа.
Кроме того, произойдут следующие преобразования клавиш:
- Строки, содержащие допустимые целые числа, будут преобразованы в целочисленный тип. Например, ключ «8» будет фактически сохранен под номером 8. С другой стороны, «08» не будет приведено, так как это недопустимое десятичное целое число.
- Плавающие числа также приводятся к целым числам, что означает, что дробная часть будет усечена. Например, ключ 8.7 будет фактически сохранен под номером 8.
- Булы также приводятся к целым числам, то есть ключ true будет фактически сохранен под 1, а ключ false под 0.
- Null будет преобразован в пустую строку, т. Е. Ключ 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 могут быть целыми или строковыми. Строки PHP - это байтовые массивы, то есть последовательности байтов. Других типов строк не существует, и в противном случае PHP не налагает каких-либо особых ограничений на строки ключей массива. Другими словами: пока это строка, все идет.
Если сложные ключи вызывают ошибку «неопределенный индекс», возможно, у вас просто проблема «обрезки».
Я сходил с ума, потому что сложный ключ выдавал ошибку «неопределенный индекс», и я подумал, может быть, это нарушение синтаксиса. Ключ массива, вызывающий ошибку, был построен из поля запроса базы данных 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 больше не жаловался.
Надеясь, что это избавит некоторых от некоторых неприятных моментов ...
У меня лично не было проблем с необычными символами в ключах массива. Что является законным, а что нет, плохо документировано, кроме как сказать, что ключ должен быть скаляром. Лучше всего просто попробовать и посмотреть.
В массиве php вы не можете использовать ключ: 2.3 или десятичные числа
Закодируйте страницу php в ANSI «é» можно будет использовать (Cinéma не будет отображаться как Cinà © ma). В Notepad ++ просто используйте меню Encode => Convert ANSI и сохраните
é
его нет, что, если OP все-таки не использует Notepad ++?
$a = (object) ['@km³' => 123]; error_log($a->@km³);