刚刚看了啊哈!力矩,在foreach
环后意外添加;
。有趣的是,这并没有抛出错误,而是跳过了循环数组中的所有内容,只触及最后一个元素。
测试代码:
$test_array = array(
'a' => 'one',
'b' => 'two',
'c' => 'three'
);
foreach ( $test_array as $key => $val );
echo $val;
问题:为什么会这样?
分号结束语句,foreach语句类似于函数——它打开一个作用域。如果不使用大括号打开多行作用域,则作用域将运行到下一个分号,因此
foreach ( $test_array as $key => $val );
相当于
foreach ( $test_array as $key => $val ) { }
我相信这回答了你的问题,为什么它会这样做
当你这样做的时候:
foreach ( $test_array as $key => $val );
这里所有的foreach都被执行(通过每个元素),但是当您放置;
时,没有其他指令利用它,相反,当它结束所有迭代时,$val
包含最后一个元素的值,您恰好在下一个指令中回显:
echo $val;
;
结束循环,因此它相当于
foreach ( $test_array as $key => $val ){ /* do nothing */ }
在循环末尾$val有最后一个键的值,因此它回显
这是所有类c语法语言的标准"特性"。也就是说,
for (...);
是
for (...) { }
同样,在你的例子中,在foreach
循环结束后,$val
不会消失,但仍然存在,并保留最后分配给它的值。
循环运行,执行迭代和条件检查,但没有其他操作。然后执行echo
命令,此时$val
包含分配给它的最后一个值。最后一个赋值就是循环中最后一个值
你所做的就是循环到所有元素,但是除了最后一个元素之外什么都不做。