foreach语句后的分号有“有趣”的结果。为什么?

时间:2013-05-31 19:47:55

标签: php arrays foreach

偶然在;循环之后添加foreach AHA!时刻。有趣的是,这并没有抛出错误,但跳过(?)循环数组中的所有内容,只是触及最后一个元素。

测试代码:

$test_array = array(
    'a' => 'one',
    'b' => 'two',
    'c' => 'three'
);
foreach ( $test_array as $key => $val );
    echo $val;

问题:为什么会发生这种情况?

6 个答案:

答案 0 :(得分:4)

当你这样做时:

foreach ( $test_array as $key => $val );

这里所有foreach都被执行(通过每个元素)但是当你推出一个;时,没有其他指令利用它,而是当它结束所有迭代时,$val包含你在下一个指令中碰巧回应的最后一个元素的值:

echo $val;

答案 1 :(得分:4)

分号结束语句,foreach语句类似于函数 - 它打开了一个范围。如果您没有打开带有大括号的多行范围,则范围将运行到下一个分号,所以

foreach ( $test_array as $key => $val );

相当于

foreach ( $test_array as $key => $val ) { }

我相信我会回答你的问题,为什么它会这样。

答案 2 :(得分:1)

;结束循环,因此等同于

foreach ( $test_array as $key => $val ){ /* do nothing */ }
循环结束时的

$ val具有最后一个键的值,因此它回显它

答案 3 :(得分:1)

这是具有类似C语法的所有语言的标准“功能”。即,

for (...);

装置

for (...) { }

此外,在您的情况下,foreach循环结束后,$val不会消失,但仍然存在,并保留分配给它的最后一个值。

答案 4 :(得分:1)

循环运行,执行迭代和条件检查,但没有别的。然后执行echo命令,此时$val包含分配的最后一个值。它分配的最后一个值是循环中的最后一个值。

答案 5 :(得分:0)

你所做的就是循环播放除了最后一个元素旁边的所有内容。