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

Replacing array in foreach loop with array modified in same loop

提问人:kevtrout 提问时间:10/23/2008 更新时间:8/10/2017 访问量:3130

问:

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

在上面的示例中,我想将$arrayOne传递到循环中,让一个函数操作来删除$arrayOne的一些元素,然后让循环传递剩余元素上的简化$arrayOne,直到循环返回 false。

建议?

PHP 循环

评论


答:

1赞 Aditya Mukherji 10/23/2008 #1

我建议有两个数组,
一个数组包含数据 - dataarray,另一个最初为空 - emptyarray 和第一个 foreachloop 中符合条件的任何数组,u 推送到第二个数组,最后清空第一个数组,
交换两个数组的标识符(dataarray 变成 emptyarray
,反之亦然)并重复直到返回 false 或其他什么

5赞 Dinoboff 10/23/2008 #2

你只需要一个函数来删除数组的某些元素吗?

如果是这样,您可以使用array_filter

3赞 Rabbit 10/23/2008 #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 上测试

评论

0赞 kevtrout 10/23/2008
unset() 是否会从 $arrayOne 中删除数组元素,以便在 foreach() 循环步入下一个数组元素时丢失它?
1赞 ggravarr 10/23/2008 #4

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

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

我建议让函数在是否删除时返回布尔值,以防止创建更多引用。例如

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引用将持续到循环范围之外,因此尾随未设置。

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

评论

0赞 kevtrout 10/23/2008
当处理或删除数组中的最后一项时,循环停止
0赞 gradbot 10/24/2008
“致命错误:无法将赋值运算符与重载对象或字符串偏移量一起使用” 您必须先给 $value['exec_failed'] 一个值,然后才能递增它。
0赞 kevtrout 10/24/2008 #5

感谢大家的帮助。最后,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'.

评论

0赞 Dinoboff 10/25/2008
你不需要第一个循环:$match=array_intersect($one,$against);foreach($one as $key=>$value){ if (in_array($Value, $match)) { unset($one[$key]);