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

sab*_*bas 1 php loops for-loop while-loop

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

循环:

$arr=[1, "",1,""];
while ($elm = array_shift($arr))
{
    var_dump($elm);
}
Run Code Online (Sandbox Code Playgroud)

对于循环:

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

为什么while退出循环?

d3L*_*d3L 7

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

var_dump((bool)""); // bool(假)

PHP手册

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

$arr = [1, "", 1, ""];
while (($elm = array_shift($arr)) !== NULL) {
    var_dump($elm);
}
Run Code Online (Sandbox Code Playgroud)

说明

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
Run Code Online (Sandbox Code Playgroud)

在你的第一个例子中你有while ($elm = array_shift($arr)):

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

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

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

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