更改 foreach 循环内的初始数组?

php
2022-08-30 14:50:36

我想要一个foreach循环,其中初始数组在循环内更改。

例如。

$array = array('red', 'blue');
foreach($array as $key => $value) {
    $array[] = 'white';
    echo $value . '<br />';
}

在这个循环中,循环将打印出红色和蓝色,尽管我在循环内添加了另一个元素。

有没有办法更改循环内的初始数组,以便添加新元素,并且foreach将使用新数组,无论更改什么?

我需要这种逻辑来执行特定任务:

我将有一个搜索链接的if语句。如果该链接存在,则将其添加到数组中。如果链接内容包含另一个链接,则将获取以进行检查。如果是这样,则添加此链接,并将获取内容,依此类推。当没有进一步建立链路时,前循环将退出


答案 1

我不认为循环是可能的,至少是你写它的方式:似乎不仅仅是工作方式;引用前言手册页foreachforeach

注意:除非引用了数组,否则 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

答案 2

您需要做的是将赋值移动到 for 循环中,并在每次迭代时检查数组的长度。

$array = array('red', 'blue');
for($i = 0; $i < count($array); $i++)
{
   $value = $array[$i];
   array_push($array, 'white');
   echo $value . '<br />';
}

请注意,这将导致无限循环(白色将在每个循环的数组末尾添加)。


推荐