2

刚吃了一个啊哈!偶然添加;一个循环后的时刻。foreach有趣的是,这并没有引发错误,而是跳过(?)循环数组中的所有内容,只触及最后一个元素。

测试代码:

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

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

4

6 回答 6

4

当你这样做时:

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

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

echo $val;
于 2013-05-31T19:52:02.187 回答
4

分号结束语句,foreach 语句类似于函数——它打开了一个范围。如果您不使用大括号打开多行范围,则范围会运行到下一个分号,因此

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

相当于

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

我相信这回答了你关于它为什么会这样表现的问题。

于 2013-05-31T19:52:37.617 回答
1

结束循环,所以这;相当于

foreach ( $test_array as $key => $val ){ /* do nothing */ }

在循环结束时 $val 具有最后一个键的值,因此它呼应它

于 2013-05-31T19:53:34.813 回答
1

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

for (...);

方法

for (...) { }

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

于 2013-05-31T19:53:46.860 回答
1

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

于 2013-05-31T19:53:49.680 回答
0

你所做的只是循环到所有,但除了最后一个元素之外什么都不做。

于 2013-05-31T20:03:09.460 回答