从循环内部向foreach循环添加新值


Add new values to foreach loop from inside the loop

是否可以将新值添加到foreach正在使用的数组中?因此,它将运行(n+x),其中n是foreach开始之前数组的元素数,x是添加到数组中的元素数。是的,我测试了。。看起来好像没有。所以我想知道我能不能为这项工作做点什么。

foreach($pages_to_visit as $key => $source){
    global $products;
    $links = baixarSource($source);
    foreach($links as $link){
        global $products;
        global $pages_to_visit;
        if(preg_match("/somestore'.com/i", $link)){
                if(!in_array($link, $pages_to_visit)){
                        $pages_to_visit[] = $link;
                }else if(preg_match("/'/produto'//i", $link) && !in_array($link, $products)){
                        $products[] = $link;
                        echo $link."'n";
                }
        }
    }
    unset($pages_to_visit[$key]);
    sleep(0.2);
}

正如您已经发现的,使用foreach()是不可能的,但是当您使用for()时,任务变得非常容易:

for ($i=0; $i<count($array); $i++) {
    //code
}

这是由于在每次迭代之前(重新)计算count($array)。您也可以使用自己递增的变量(递增比计数数组更容易)

$max = count($array);
for ($i=0; $i<$max; $i++) {
    //code
    //when push an element just do $max++;
}

当然,这只适用于数字指数,但这里似乎就是这样。

如果要在foreach中修改数组本身,则需要在foreach代码中指定"runner"变量作为引用。

http://us2.php.net/manual/en/control-structures.foreach.php

为了能够直接修改循环中$value前面带有&的数组元素;。在这种情况下,该值将通过引用进行分配。

示例(仅计数为9):

$arr = array(1,2,3,4,5,6,7,8,9);
$makeArrayLonger = true;
foreach ($arr as $blubb)
{
    if ($makeArrayLonger)
    {
        $arr[] = 10;
        $makeArrayLonger = false;
    }
    echo $blubb;
}

示例2(这一次它将使用从foreach内部添加的附加元素计数为10):

$arr = array(1,2,3,4,5,6,7,8,9);
$makeArrayLonger = true;
foreach ($arr as &$blubb)
{
    if ($makeArrayLonger)
    {
        $arr[] = 10;
        $makeArrayLonger = false;
    }
    echo $blubb;
}

不确定我是否答对了你的问题。。。我认为你试图做的事情根本没有多大意义。

echo $countBefore = count($data);
foreach ($data $as $value) {
    $data[] = 'Some new value';
}
echo $countAfter = count($data);