我刚刚注意到,使用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退出循环?
答案 0 :(得分:7)
因为空字符串是PHP中的 falsy 值:
var_dump((bool)“”); // bool(false)
要使第一个示例使用空字符串,您应该检查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);
}
这是因为,除非数组为空,否则数组始终是真实的,无论它们包含什么值。