0

遇到了一个小障碍,想知道是否有“最佳实践”方式来解决它。

所以我刚刚了解到“无论如何,一个 php foreach 都将在整个数组上执行。测试取消设置迭代中的下一个值。它将在偏移量上进行迭代,但该值将为空。 – Kevin Peno 2009 年 12 月 22 日 21 :31" 来自如何在 foreach 循环中删除数组元素?

这是让我感到困惑的第一部分。我正在使用 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 循环仍然遍历这些并给我返回一堆空数组。

我确实读过PHP 'foreach' 是如何工作的?我得到了一些。

谢谢

4

2 回答 2

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)

于 2013-05-18T18:45:28.320 回答
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);
于 2013-05-18T16:08:54.473 回答