$array = array (0.1 => 'a', 0.2 => 'b');
echo count ($array);
它用第二个覆盖第一个数组元素,因为我使用了浮点数为0。
因此上述代码的输出为1,而不是2。
为什么PHP将数组索引降为0?
答案 0 :(得分:6)
数组键被解释为数字,但数字键必须是整数。因此,两个浮点值都被强制转换(截断)为整数零,0.2
覆盖0.1
。
var_dump($array);
array(1) {
[0]=>
string(1) "b"
}
如果要使用非整数值,请创建数组键字符串:
$array = array ("0.1" => 'a', "0.2" => 'b');
echo count($array);
// 2
array(2) {
["0.1"]=>
string(1) "a"
["0.2"]=>
string(1) "b"
}
答案 1 :(得分:2)
只允许整数作为数组的键。
如果我是print_r($ array),请看看我们得到了什么:
Array ( [0] => b )
但是你可以这样做:
$array = array ('0.1' => 'a', '0.2' => 'b');
现在print_r说:
Array ( [0.1] => a [0.2] => b )
答案 2 :(得分:1)
数组索引不能是浮点数。它们必须是整数或字符串。如果您尝试var_dump($array);
,您会看到您的数组看起来像这样:
array(1) {
[0]=> string(1) "b"
}
您实际上是在尝试两次设置密钥0
的值。
答案 3 :(得分:1)
您不能将浮点数用作数字键。 0.1
和0.2
都会转换为0
要么必须使用整数或字符串。因此,您的选择是:
$array = array ('0.1' => 'a', '0.2' => 'b');
或者:
$array = array (1 => 'a', 2 => 'b');
答案 4 :(得分:1)
让我们看看PHP's own excellent manual says about arrays(强调我的):
密钥可以是整数或字符串。值可以是任何值 类型。
此外还会发生以下关键演员:[...] 浮动也会被投射到 整数,这意味着小数部分将被截断。
所以,如果你看一下你的数组:
<?php
$array = array (0.1 => 'a', 0.2 => 'b');
var_dump($array); // let's see what actually *is* in the array
echo count ($array);
你会得到这个回复:
array(1) {
[0]=>
string(1) "b"
}
1
因此,首先您的数组为{ 0 => 'a' }
,然后变为{ 0 => 'b' }
。计算机完全按照您要求的方式完成,即使不是您想要的。
可能的解决方案:将数组键作为字符串传递 - 没有转换为int
,并且它按预期工作。
$array = array ('0.1' => 'a', '0.2' => 'b');
答案 5 :(得分:0)
您必须在非整数键上使用引号
$array = array ('0.1' => 'a', '0.2' => 'b');
echo count($array);
答案 6 :(得分:0)
您将'a'存储到第0.1个元素中,将'b'存储到第0.2个元素中。这是不可能的。数组索引必须是整数。
也许您想要使用关联数组?
$array = array ('0.1' => 'a', '0.2' => 'b');
答案 7 :(得分:0)
根据有关键的数组的php.net文档:
此外,还会发生以下关键演员: 浮点数也被转换为整数,这意味着小数部分 将被截断。例如。密钥8.7实际上将存储在8下。
我尝试dumping并解释结果... 0.1和0.2将被解释为0,后者将覆盖前者,最终结果是数组键保持为0,值设置为b。
因此这种行为没有任何问题。
答案 8 :(得分:0)
因为浮点数被转换为整数,所以第二个条目会覆盖第一个。
其实你这样做了:
$array = array (0 => 'a', 0 => 'b');
echo count ($array);
Php.net Array: “浮点数也被转换为整数,这意味着小数部分将被截断。例如,键8.7实际上将存储在8下。”