陷入困境,想知道是否有最佳实践"绕过它。
所以我刚学会了#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?并得到了一些内容。
由于
答案 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)
)