Foreach和unset()

时间:2013-05-18 16:01:21

标签: php loops foreach unset

陷入困境,想知道是否有最佳实践"绕过它。

所以我刚学会了#34;一个php foreach将在整个数组上执行,无论如何。测试取消迭代中下一个值。它将迭代偏移量,但该值将为null。 - Kevin Peno 12月22日&09; 21:31"来自How do you remove an array element in a foreach loop?

这是弄乱我的第一部分。我用foreach迭代一个数组。它是一个搜索功能,所以我删除了我刚刚搜索过的元素,所以当循环再次运行时它会减去该元素。

如果可能的话,我不想重新索引,尽管我必须这样做。

Array
(
[0] => Array
    (
        [0] => a
        [1] => aa
        [2] => aaa
    )

[1] => Array
    (
        [0] => b
        [1] => bb
        [2] => bbb
    )

[2] => Array
    (
        [0] => c
        [1] => cc
        [2] => ccc
    )

[3] => Array
    (
        [0] => d
        [1] => dd
        [2] => ddd
    )

foreach($array as $key=>$value) {
   $searchresult[] = search function returns various other keys from array

   foreach($searchresult as $deletionid) {
      unset($array[$deletionid]);
   } 
}

所以在第一次迭代时它显然使用$ array [0]但是$ searchresults可能会返回4,5,6,7。所以这些键是从$ array中删除的。

然而foreach循环仍然遍历那些并且给了我一堆空数组。

我读过How does PHP 'foreach' actually work?并得到了一些内容。

由于

2 个答案:

答案 0 :(得分:1)

在我看来,基于索引删除数组元素的最佳方法是使用array_ *函数集,例如array_diff和array_intersect(或者在你的情况下使用array_diff_key和array_intersect_key)。

$indexes_to_remove = array(2,3,4);
$indexes_to_remove = array_flip($indexes_to_remove);

$array = array_diff_key($array,$indexes_to_remove);

答案 1 :(得分:1)

如果阵列保证在某些时候用尽,你可以使用:

while (true) {
    $searchresult[] = search function returns various other keys from array

    foreach($searchresult as $deletionid) {
        unset($array[$deletionid]);
    }
    if (count($array) === 0) {
        break;
    }
}

是的,我知道while (true)非常邪恶,但我发现在这样的情况下,它确实完全需要。 如果你想阻止它进行无限循环,你总是可以添加一个变量,增加每次迭代,并且break当它达到一个永远不会发生的高值时(比如10 * count($array)