用同一循环中修改的数组替换foreach循环中的数组

时间:2008-10-23 12:06:07

标签: php loops

foreach($arrayOne as $value){
    do function
}

在上面的例子中,我想将$ arrayOne传递给一个循环,有一个函数操作,删除$ arrayOne的一些元素,然后让循环遍历减少的$ arrayOne,直到剩下的元素loop返回false。

建议?

5 个答案:

答案 0 :(得分:5)

您是否只需要一个函数来删除数组中的某些元素?

如果是,您可以使用array_filter

答案 1 :(得分:3)

如果要修改数组项的值,请按引用使用。如果要完全删除数组项,请拆分键/值对。

$arrayOne = array('example', 'listing of', 'stuff');

foreach ($arrayOne as $key => &$value) {
    $value .= ' alteration';

    if ($value == 'listing of alteration') {
        unset($arrayOne[ $key ]);
    }

}

上面的代码会将文本“alteration”添加到数组中每个项目的末尾。 当匹配“更改列表”时,它也将删除第二个索引。在PHP 5.2上测试

答案 2 :(得分:1)

我建议有两个数组,
一个有数据的数据 - dataarray,
另一个最初是空的 - 空心的 无论在第一个foreachloop中有什么限定条件,你都会进入第二个数组,并在结束时清空第一个数组,交换两个数组的标识符(dataarray变为空行和反之)并重复直到你返回false或者其他< / p>

答案 3 :(得分:1)

Rabbit有正确的答案,可以使用引用编辑值和索引在foreach循环中取消设置(我会投票给你,但这是我的第一篇文章,所以我还没有15个代表,对不起)

如果将其传递给需要编辑该值的函数,请务必记住使用该引用。 如果要从中删除值,您还需要将数组作为引用传递。

我建议在是否删除时使函数返回boolean以防止创建更多引用。 e.g。

foreach ($array AS $key => &$value) {
    //& reference only needed if execFunction must edit $value
    if (execFunction(&$value)) { 
        unset($array[$key]);
    } else {
        $value['exec_failed']+=1;
    }
}
unset($value);

$ value引用也将持续超出循环范围,因此尾随未设置。

最后一想,听起来好像你想多次循环遍历数组。请务必注意循环停止执行的方式。

答案 4 :(得分:0)

感谢大家的帮助。 unset()函数最终是对我今天的特定需求有用的东西。这是我使用unset()的简短故事:

//array to be processed
$one=array('1','2','3');
//array of terms previously defined as a group to compare against
$against=array('1','2');

foreach($one as $key=>$value){

    //pull out matching terms   
    $match=array_intersect($one,$against);
    //my need is to sum grouped numbers
    $sum=array_sum($match);
    echo $sum."<br />";

    //remove matching terms from original array
    foreach($match as $key=>$value){
        unset($one[$key]);
    }
}
//now a parent looping function will process the remaining array elements. In this case, the only one left is '3'.