让我通过说我知道它是什么foreach,做什么以及如何使用它来加上前缀.这个问题涉及它如何在发动机罩下工作,我不希望任何答案都是"这就是你如何循环阵列foreach".
很长一段时间,我认为这foreach与数组本身一起工作.然后我发现许多引用它的数据副本的事实,我已经假设这是故事的结尾.但是我最近讨论了这个问题,经过一些实验后发现这实际上并非100%正确.
让我说明我的意思.对于以下测试用例,我们将使用以下数组:
$array = array(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
foreach ($array as $item) {
echo "$item\n";
$array[] = $item;
}
print_r($array);
/* Output in loop: 1 2 3 4 5
$array after loop: 1 2 3 4 5 1 2 3 4 5 */
Run Code Online (Sandbox Code Playgroud)
这清楚地表明我们不直接使用源数组 - 否则循环将永远持续,因为我们在循环期间不断地将项目推送到数组.但只是为了确保这种情况:
foreach ($array as $key => $item) {
$array[$key + 1] = $item + 2;
echo "$item\n";
}
print_r($array);
/* Output …Run Code Online (Sandbox Code Playgroud) 我正在攻读Zend PHP认证.
不确定这个问题的答案.
问题:使用PHP 5迭代和修改数组的每个元素的最佳方法是什么?
a)您无法在迭代期间修改数组
b)
for($i = 0; $i < count($array); $i++) { /* ... */ }C)
foreach($array as $key => &$val) { /* ... */ }d)
foreach($array as $key => $val) { /* ... */ }E)
while(list($key, $val) = each($array)) { /* ... */ }
我的本能是(B),因为不需要创建临时变量,然后我意识到它不适用于关联数组.进一步搜索网络发现:将不变数组计数存储在单独的变量中可以提高性能.
$cnt = count($array);
for ($i = 0; $i < $cnt; $i++) { }
Run Code Online (Sandbox Code Playgroud) 此代码产生意外的输出:
$array=str_split("abcde");
foreach($array as &$item)
echo $item;
echo "\n";
foreach($array as $item)
echo $item;
Run Code Online (Sandbox Code Playgroud)
输出:
abcde
abcdd
Run Code Online (Sandbox Code Playgroud)
如果&$item用于第二个循环一切正常.
我不明白这段代码会如何影响内容 $array.我可以认为隐含unset($header)会删除最后一行,但双dd来自哪里?