为什么带有空字符串的数组上的array_shift会破坏循环?

时间:2018-03-10 19:08:00

标签: php loops for-loop while-loop

我刚刚注意到,使用while和array_shift迭代数组的行为与遇到空字符串时的简单for循环不同。这是一个示例:

while loop:

$arr=[1, "",1,""];
while ($elm = array_shift($arr))
{
    var_dump($elm);
}

For loop:

$arr=[1, "",1,""];
for ($i = 0; $i<count($arr); $i++)
{
    var_dump($arr[$i]);
}
die();

为什么while退出循环?

4 个答案:

答案 0 :(得分:7)

因为空字符串是PHP中的 falsy 值:

  

var_dump((bool)“”); // bool(false)

The PHP Manual

要使第一个示例使用空字符串,您应该检查array_shift返回 NULL

$arr = [1, "", 1, ""];
while (($elm = array_shift($arr)) !== NULL) {
    var_dump($elm);
}

<强>解释

array_shift从数组中删除第一个元素并返回其值:

$arr = [1, ""];
array_shift($arr); // we get 1
array_shift($arr); // we get ""
array_shift($arr); // we get NULL because the array is empty now

在您的第一个示例中,您有while ($elm = array_shift($arr)),表示:

  • 删除第一个元素并将其值保存在$elm
  • $elm解释为布尔值(这是隐式完成的),只有在评估为 TRUE 时才会继续。

让我们手动完成每次迭代,使其更清晰:

  • 第一次迭代:while ($elm = 1) - &gt; while (true)因为1是真的。 我们继续循环

  • 第二次迭代:while ($elm = "") - &gt; while (false)因为空字符串是假的。 我们退出循环

答案 1 :(得分:2)

因为空字符串的计算结果为false

答案 2 :(得分:1)

因为数组的第二个值是空字符串,它会转换为bool false

尝试使用另一个数组,一切都会很好:

$arr=[1, "non-empty value", 1, "another non-empty value"];
while ($elm = array_shift($arr))
{
    var_dump($elm);
    echo '<br>'; // this is bonus ;)
}

答案 3 :(得分:0)

如果数组包含null,则其他人提出的解决方案仍然容易出错。如果确实需要修改数组而不是执行简单的foreach,则构造该数组的可靠方法是:

while ($arr)
{
    $elm = array_shift($arr)
    var_dump($elm);
}

这是因为,除非数组为空,否则数组始终是真实的,无论它们包含什么值。