为什么我在php中得到错误的数组计数

时间:2012-03-29 11:35:12

标签: php arrays

$array = array (0.1 => 'a', 0.2 => 'b');
echo count ($array);

它用第二个覆盖第一个数组元素,因为我使用了浮点数为0。

因此上述代码的输出为1,而不是2。

为什么PHP将数组索引降为0?

9 个答案:

答案 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.10.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下。”