89

我有一些 php 数组键,其中填充了很多奇怪的字符。

这是允许的吗?我不能使用的东西有什么限制吗?

4

11 回答 11

97

根据手册

键可以是整数或字符串。该值可以是任何类型。

此外,还会发生以下关键转换:

  • 包含有效整数的字符串将被转换为整数类型。例如,键“8”实际上将存储在 8 下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数。
  • 浮点数也被转换为整数,这意味着小数部分将被截断。例如,密钥 8.7 实际上将存储在 8 之下。
  • 布尔值也被转换为整数,即键 true 将实际存储在 1 下,而键 false 将存储在 0 下。
  • Null 将被强制转换为空字符串,即键 null 将实际存储在 "" 下。
  • 数组和对象不能用作键。这样做会导致警告:非法偏移类型。

再次使用手册:

字符串是一系列字符,其中一个字符与一个字节相同。这意味着 PHP 仅支持 256 个字符集,因此不提供原生 Unicode 支持。查看字符串类型的详细信息。

所以简而言之,任何字符串都可以是键。一个字符串可以包含任何二进制数据(最大 2GB)。因此,键可以是任何二进制数据(因为字符串可以是任何二进制数据)。

一些随机(有效)滥用数组键:

$w = array(chr(0) => 'null byte?', chr(rand(0, 255)) => 'random byte?');
var_dump($w);
于 2012-05-22T05:21:03.223 回答
12

键必须是字符串或整数。发生了一些演员表,但我认为手册很好地解释了:

键可以是整数或字符串。该值可以是任何类型。

此外,还会发生以下关键转换:

  • 包含有效整数的字符串将被转换为整数类型。例如,键“8”实际上将存储在 8 下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数。
  • 浮点数也被转换为整数,这意味着小数部分将被截断。例如,密钥 8.7 实际上将存储在 8 之下。
  • 布尔值也被转换为整数,即键 true 将实际存储在 1 下,而键 false 将存储在 0 下。
  • Null 将被强制转换为空字符串,即键 null 将实际存储在 "" 下。
  • 数组和对象不能用作键。这样做会导致警告:非法偏移类型。
于 2012-05-22T05:20:50.110 回答
11

我找到了这个答案,以寻找有关我遇到的问题的更多信息。我使用的是带有 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!
于 2013-07-11T10:22:48.997 回答
6

PHP 数组键可以是整数或字符串。PHP 字符串是字节数组,即字节序列。没有其他类型的字符串,PHP 不会对数组键字符串施加任何特殊限制。换句话说:只要它是一个字符串,任何事情都会发生。

于 2012-05-22T05:22:03.240 回答
5

任何可以填充到 PHP 字符串中的东西都可以用作数组键。允许的字符没有限制。

$a = array();

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

$x = array();
echo $a[$x]; // not ok
于 2012-05-22T05:21:38.077 回答
1

如果复杂键导致“未定义索引”错误,您可能只是遇到了“修剪”问题。

我要疯了,因为一个复杂的键正在吐出“未定义的索引”错误,我认为这可能是语法违规。导致错误的数组键是从 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 就不再抱怨了。

希望这可以使其他人免于一些令人沮丧的时刻......

于 2018-10-21T10:57:27.300 回答
0

我个人对数组键中的异常字符没有任何问题。什么是合法的和不合法的并没有很好的记录,只是说密钥必须是一个标量。你最好的选择是试试看。

于 2012-05-22T05:21:56.013 回答
0

在 php 数组中,您不能使用键:2.3 或十进制数

于 2020-10-27T06:16:15.853 回答
0

除了所有正确的答案之外:您可以使用PSR,它们是最好的程序员之间的某种规则,以获得良好和标准的编码风格。

于 2017-04-19T13:03:49.343 回答
0

对于这种和平的代码:

$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³"});

(带{}

于 2021-10-05T08:49:34.127 回答
-1

用ANSI“é”编码php页面就可以使用(Cinéma不会显示为Cinéma)。在 Notepad++ 中,只需使用菜单 Encode=>Convert ANSI 并保存

于 2018-09-10T12:10:34.667 回答