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

时间:2010-02-27 16:38:14

标签: php

我希望有一个foreach循环,其中初始数组在循环内更改。

例如

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

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

有没有办法改变循环中的初始数组,这样就可以添加新的元素,而foreach将使用新的数组进行更改?

我需要这种逻辑来完成特定的任务:

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

5 个答案:

答案 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之前加&。在这种情况下,值将由   reference[source]

您需要对旧代码执行的操作是

  

$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建议你可以修改循环中的所有数组元素,包括添加/删除元素。