我希望有一个foreach循环,其中初始数组在循环内更改。
例如
$array = array('red', 'blue');
foreach($array as $key => $value) {
$array[] = 'white';
echo $value . '<br />';
}
在这个循环中,循环将打印出红色和蓝色,尽管我在循环中添加了另一个元素。
有没有办法改变循环中的初始数组,这样就可以添加新的元素,而foreach将使用新的数组进行更改?
我需要这种逻辑来完成特定的任务:
我将有一个if语句来搜索链接。如果该链接存在,则将其添加到数组中。如果链接内容包含另一个链接,则将提取该链接内容以进行检查。如果是这样,则添加此链接,并且将提取内容,依此类推..当没有进一步建立链接时,foreach循环将退出
答案 0 :(得分:45)
我认为这不可能用foreach
循环,至少你写它的方式:似乎不是foreach
的工作方式;引用the manual page of foreach
:
注意:除非引用了数组,否则foreach将在副本上运行 指定的数组而不是 数组本身。
编辑:在考虑了一下这个说明之后,实际上是可能的,这就是解决方案:
说明“除非数组被引用”;这意味着这部分代码应该有效:
$i = 0;
$array = array('red', 'blue');
foreach($array as $key => & $value) {
$array[] = 'white';
echo $value . '<br />';
if ($i++ >= 5) {
break; // security measure to ensure non-endless loop
}
}
请注意&
之前的$value
。
它实际显示:
red
blue
white
white
white
white
这意味着添加&
实际上是您正在寻找的解决方案,从foreach
循环内修改数组; - )
编辑:这是我在考虑该说明之前提出的解决方案:
你可以使用while
循环,“手动”做更多的工作;例如:
$i = 0;
$array = array('red', 'blue');
$value = reset($array);
while ($value) {
$array[] = 'white';
echo $value . '<br />';
if ($i++ >= 5) {
break; // security measure to ensure non-endless loop
}
$value = next($array);
}
会得到这个输出:
red
blue
white
white
white
white
答案 1 :(得分:7)
您需要做的是在for循环中移动赋值并在每次迭代时检查数组的长度。
$array = array('red', 'blue');
for($i = 0; $i < count($array); $i++)
{
$value = $array[$i];
array_push($array, 'white');
echo $value . '<br />';
}
注意,这将导致无限循环(在每个循环中,白色将添加到数组的末尾)。
答案 2 :(得分:4)
也许您应该使用其他方式,例如:
$ar = array('blue', 'red');
while ($a = array_pop($ar) {
array_push($ar, 'white');
}
或类似的东西......
答案 3 :(得分:1)
您可以使用$ key
访问该阵列$array = array('red', 'blue');
foreach($array as $key => $value) {
$array[$key] = 'white';
}
答案 4 :(得分:1)
您需要对旧代码执行的操作是
在
$value
之前&
喜欢这样
$array = array('red', 'blue');
foreach($array as $key => &$value) {// <-- here
$array[] = 'white';
echo $value . '<br />';
}
while循环将是一个更好的解决方案。
while (list ($key, $value) = each ($array) ) {
$array[] = 'white';
echo $value . '<br />';
}
如果您不需要$ key变量,正如您的示例所示,那么使用$value = array_pop($array)
代替list ($key, $value) = each ($array)
将是一个更便宜的选项。请参阅@enrico-carlesso's回答Here
由于你的数组是sequantial(数字,索引)而不是关联的,所以你可以使用for
循环。
for ($key = 0; $key < count($array); ++$key) {
$value = $array[$i];
$array[] = 'white';
echo $value . '<br />';
}
作为旁注。
我不明白为什么是&$value
而不是&array
。
&$value
建议您只能修改循环中的当前元素。
&array
建议你可以修改循环中的所有数组元素,包括添加/删除元素。