Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP数组_key_存在-某些类型松散,另一种类型严格_Php_Arrays - Fatal编程技术网

PHP数组_key_存在-某些类型松散,另一种类型严格

PHP数组_key_存在-某些类型松散,另一种类型严格,php,arrays,Php,Arrays,尽管我对PHP的特性比较了解,但以下几点今天仍然让我感到困惑: // loose $a = array(true => 'foo'); var_dump(array_key_exists(1, $a)); // strict $a = array('7.1' => 'foo'); var_dump(array_key_exists('7.10', $a)); 我想知道这种效果的技术原因是什么,所以问题是,在这个函数背后的过程中,是什么导致某些类型的值被松散地比较,而其他类型的值被

尽管我对PHP的特性比较了解,但以下几点今天仍然让我感到困惑:

// loose
$a = array(true => 'foo');
var_dump(array_key_exists(1, $a));

// strict
$a = array('7.1' => 'foo');
var_dump(array_key_exists('7.10', $a));

我想知道这种效果的技术原因是什么,所以问题是,在这个函数背后的过程中,是什么导致某些类型的值被松散地比较,而其他类型的值被严格地比较?我不是在抱怨这种行为,而是在试图理解这一点,因此PHP没有必要发出糟糕的评论。

在第一种情况下,布尔值不是有效的数组键,因此在初始化数组时,它会立即变为1,使搜索匹配


在第二种情况下,数组键是一个字符串,“7.1”与“7.10”不是同一个字符串。在第一种情况下,布尔值不是有效的数组键,因此在初始化数组时,它会立即变为1,使搜索匹配

在第二个示例中,数组键是字符串,“7.1”与“7.10”不是同一个字符串。在第二个示例中,“7.1”和“7.10”是字符串。它们作为字符串进行比较,因此不匹配

现在,为什么在第一个示例中有匹配项?数组键可以是字符串或整数。因此,true被转换为整数,其计算结果为1。

在第二个示例中,“7.1”和“7.10”是字符串。它们作为字符串进行比较,因此不匹配


现在,为什么在第一个示例中有匹配项?数组键可以是字符串或整数。因此true被转换为整数,其计算结果为1。

也许您可以在那里添加脚本输出?第一眼看到:布尔值作为数组键?我不认为这会有任何帮助!第二:7.10与7.1不一样-在中声明它将使其成为字符串


如果希望将true作为键名,则需要将其封装在单引号或双引号中。如果您不了解PHP和单引号/双引号,它将导致内容被视为字符串值,而不是布尔真/假的整数。您可以在那里添加脚本输出吗?第一眼看到:布尔值作为数组键?我不认为这会有任何帮助!第二:7.10与7.1不一样-在中声明它将使其成为字符串


如果希望将true作为键名,则需要将其封装在单引号或双引号中。如果您不了解PHP和单引号/双引号,它将导致内容被视为字符串值,而不是布尔真/假整数,这是有文档记录的。请注意,键是整数或字符串。文档中提到了特定的键强制转换,特别是对于布尔被强制转换为整数的情况,即true为1,false为0。如其他地方所述,您的其他示例是字符串删除引号使其浮动,然后根据文档将其截断为整数。

这是有文档记录的。请注意,键是整数或字符串。文档中提到了特定的键强制转换,特别是对于布尔被强制转换为整数的情况,即true为1,false为0。如其他地方所述,您的其他示例是字符串,删除引号使其浮动,然后根据文档将其截断为整数。

数组键始终转换为整数。我以为你会被echo'7.1'='7.10'弄糊涂;我不确定你认为奇怪的是什么…也许你可以在那里添加脚本输出?第一眼看到:布尔值作为数组键?我不认为这有任何帮助!第二:7.10与7.1不一样——在中声明这一点会使其成为一个字符串……@MikeBrant-meze从未说过你不能;但是,7.1或7.10将是浮点,因此不能用作数组键中的纯整数,只能用作字符串。数组_key_确实存在松散的比较,但只有在键的类型不同时才会注意到这一点$a=数组'1'=>foo';var\u dumparray\u key\u exists1,$a;会给你真实的感觉。在第二种情况下,两个键都是字符串,因此它们会进行比较。数组键总是转换为整数。我以为你会被echo'7.1'='7.10'弄糊涂;我不确定你认为奇怪的是什么…也许你可以在那里添加脚本输出?第一眼看到:布尔值作为数组键?我不认为这有任何帮助!第二:7.10与7.1不一样——在中声明这一点会使其成为一个字符串……@MikeBrant-meze从未说过你不能;但是,7.1或7.10将是浮点,因此不能用作数组键中的纯整数,只能用作字符串。数组_key_确实存在松散的比较,但只有在键的类型不同时才会注意到这一点$a=数组'1'=>foo';var\u dumparray\u key\u exists1,$a;会给你真实的感觉。在第二种情况下,这两个键都是字符串,因此它们会进行比较。虽然true不是有效的数组键,但如果键为“1”,它也会返回true。所以类型转换确实发生了,我相信这是因为PHP数组在关联时,处理起来就像hashmap:即,所有strin
gs被转换成整数字符串的散列,然后用它来查找。@Robert:你可能是对的。不能将“1”和“1”都作为键的数组,因此数组内部映射到同一个值。所有这些都记录在中。具体来说,包含有效整数的字符串将强制转换为整数类型。虽然true不是有效的数组键,但如果键为“1”,它也将返回true。所以类型转换确实发生了。我相信这是因为PHP数组在关联时,处理起来就像hashmap:也就是说,所有字符串都被转换成整数字符串的散列,然后用它来查找。@Robert:你可能是对的。不能将“1”和“1”都作为键的数组,因此数组内部映射到同一个值。所有这些都记录在中。具体来说,包含有效整数的字符串将强制转换为整数类型。