【问题标题】:array size > 0 although no key is set数组大小 > 0 虽然没有设置键
【发布时间】:2011-11-23 13:05:36
【问题描述】:

简短的问题。

举个例子:

$arr = array();
$arr[0] = false ?: NULL;
var_dump($arr[0]);
var_dump($arr[1]);
var_dump(isset($arr[0]));
var_dump(isset($arr[1]));
var_dump(count($arr));

结果输出是:

NULL 
NULL 
bool(false) 
bool(false) 
int(1)

为什么结果数组的大小是 1 而不是 0,在使用三元运算符时有什么方法可以防止这种情况发生?是错误还是预期行为?

顺便说一句,我正在运行 php 5.3.3-7,但目前无法在其他版本上对其进行测试。

【问题讨论】:

    标签: php arrays null ternary-operator array-key


    【解决方案1】:

    isset() 如果未设置变量,则返回 false,或变量等于NULL。在这种情况下,$arr[0] 显式设置为 NULL。这在语义上与实际 unset()ing 不同:变量仍然设置,它只是设置为一个空值。

    简而言之:按预期工作。这是一个不幸的副作用,不同的函数做的事情略有不同。

    作为旁注,在此数组上使用 foreach 实际上也会返回 0 => NULL 键/值对,正如您对 count() 返回的值所期望的那样。

    【讨论】:

    • 感谢您的快速响应。那么,在使用三元运算符时有什么方法可以避免这种行为,还是在这种情况下我只需要使用长 if(){} 语句?
    • @FlorianKernler:如果你想真正取消它,那么你需要打电话给unset()。这是因为将数组的元素设置为 NULL 是一个有效的选择并且经常使用。
    • 实际上我在使用三元运算符时正在寻找更像“如果为空则不设置”的东西。先设置变量然后取消设置对我来说听起来效率不高。
    • @FlorianKernler:如果您希望有条件地设置变量,请使用if 语句有条件地设置变量。这就是它存在的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多