5

假设我定义了一个数组:

$a = Array();
$a[0] = 1;
$a['0'] = 2;
$a['0a'] = 3;
print_r($a);

输出是相当预期的。我假设内部有某种strval()intval()正在进行以允许覆盖该值。

Array
(
    [0] => 2
    [0a] => 3
)

但这让我感到困惑。

foreach($a as $k => $v) {
    print(gettype($k) . "\n");
}

这给了我:

integer
string

PHP 在使用数组键时如何在内部进行这些类型转换?即,它如何根据文档确定密钥是“有效的十进制整数” ?此外,is_int不适用于字符串。

4

1 回答 1

9

全部在php 手册中解释

PHP 中的数组实际上是一个有序映射。

键可以是整数或字符串。

执行了一些类型转换(即使在字符串上)

包含有效整数的字符串将被转换为整数类型。例如,键“8”实际上将存储在 8 下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数。

浮点数也被转换为整数,这意味着小数部分将被截断。例如,密钥 8.7 实际上将存储在 8 下。

布尔值也被转换为整数,即键 true 将实际存储在 1 下,而键 false 将存储在 0 下。

Null 将被强制转换为空字符串,即键 null 将实际存储在 "" 下。

数组和对象不能用作键。这样做会导致警告:非法偏移类型。

编辑

如果你想了解更多关于 PHP 如何在内部处理数组,我推荐这篇文章

于 2013-01-30T19:39:16.547 回答