我有一些php数组键,其中填充了许多奇怪的字符。
可以吗?我无法使用的物品有任何限制吗?
Answers:
根据手册:
键可以是整数或字符串。该值可以是任何类型。
此外,将进行以下按键强制转换:
- 包含有效整数的字符串将强制转换为整数类型。例如,键“ 8”实际上将存储在8以下。另一方面,“ 08”将不是强制转换,因为它不是有效的十进制整数。
- 浮点数也被强制转换为整数,这意味着小数部分将被截断。例如,密钥8.7实际上将存储在8以下。
- 布尔也被强制转换为整数,即,键true将实际存储在1以下,而键false将存储在0以下。
- 空值将强制转换为空字符串,即键空值实际上将存储在“”下。
- 数组和对象不能用作键。这样做将导致警告:偏移量类型非法。
再次手册:
字符串是一系列字符,其中字符与字节相同。这意味着PHP仅支持256个字符的集合,因此不提供本机Unicode支持。查看字符串类型的详细信息。
简而言之,任何字符串都可以作为键。字符串可以包含任何二进制数据(最大2GB)。因此,键可以是任何二进制数据(因为字符串可以是任何二进制数据)。
数组键的一些随机(有效)滥用:
$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以下。
- 空值将强制转换为空字符串,即键空值实际上将存储在“”下。
- 数组和对象不能用作键。这样做将导致警告:偏移量类型非法。
我找到了这个答案,以寻找有关我遇到的问题的更多信息。我使用的字符串中包含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数组中,您不能使用key:2.3或十进制数字
可以使用ANSI“é”对php页面进行编码(Cinéma不会显示为Cinéma)。在Notepad ++中,只需使用菜单Encode => Convert ANSI并保存
é
不存在怎么办,如果OP根本不使用Notepad ++怎么办?
$a = (object) ['@km³' => 123]; error_log($a->@km³);