为什么在php数组中将null键值更改为1?

时间:2013-02-24 09:31:14

标签: php arrays null boolean

以下是我正在测试的代码 -

<?php

error_reporting(E_ALL);

$myarr = array(NULL => "swapnesh", TRUE => 1, 4 => "swap", "swap" => 4, TRUE => NULL, NULL => TRUE );
echo "<pre>";
//var_dump($myarr);
print_r($myarr);
echo count($myarr);

此代码输出 -

Array
(
    [] => 1
    [1] => 
    [4] => swap
    [swap] => 4
)
4

关于代码的疑虑/疑问 -

  1. 为什么NULL作为键更改值为1(在第一个索引处)我可以考虑一个场景,当有人可能建议因为NULL因为一个键被使用两次所以值被覆盖但是我用FALSE检查它所以它必须输出0但是没有在这种情况下输出值。
  2. 第二个值1为空白但是它应该是1。
  3. 计数是4,我想的是5或6但是4我不知道它是如何跳过最后两个值。
  4. 在询问之前进行搜索 -

    在php网上我检查了文档,发现这是相关的东西,但在我的情况下无法解决。 链接 - http://php.net/manual/en/language.types.array.php

    编辑对于第3点我相信TRUE&amp; NULL被使用了两次,即它输出4然后让我知道它是否完全是这种情况。

3 个答案:

答案 0 :(得分:3)

您正在使用print_r,它使您的输出可读:

  1. NULL键从"swapnesh"覆盖到truetrue的可打印表示形式为1
  2. NULLfalse不会以可打印格式生成输出。
  3. 计数为4,因为您正在覆盖2个键。
  4. 要获得更好的变量输出,请使用var_dump

答案 1 :(得分:1)

  

为什么NULL作为键更改值为1(在第一个索引处)我可以考虑一个场景,当有人可能建议因为NULL因为一个键被使用两次所以值被覆盖但是我用FALSE检查它因此它必须输出0但是没有在这种情况下输出值。

PHP将布尔值FALSE打印为空字符串。将它转换为int以获得'0'。

  

第二个值1为空白但它应该是1。

TRUE也被用作键两次,因此它的值被覆盖为NULL,打印为空字符串。

  

计数是4,我想的是5或6但是4我不知道它是如何跳过最后两个值。

您的计数较低,因为数组中的最后两个值会覆盖数组中的现有值。

答案 2 :(得分:0)

nulltrue不是有效密钥。键可以是字符串或整数。 nulltrue分别转换为空字符串和1,这意味着您有几个空字符串/ 1密钥相互覆盖。

如果您想要自动编入索引的密钥,请将密钥保持关闭状态:

$myarr = array("swapnesh", 1, 4 => "swap", "swap" => 4, null, true);