遇到了一个小问题,想知道是否有“最佳实践”的方法。
所以我刚刚了解到“一个php foreach将在整个数组上执行。测试取消设置下一个迭代中的值。它将在偏移量上迭代,但值将为null。- Kevin Peno Dec 22 '09 at 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,但$searchresults可能返回4,5,6,7,因此这些键从$array中删除。
但是foreach循环仍然会遍历这些数组,并返回一堆空数组。
我确实读过How does PHP 'foreach' actually work?,而且我也读到了一些。
谢谢
发布于 2013-05-19 00:08:54
在我看来,删除基于索引的数组元素的最好方法是使用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-19 02:45:28
如果数组肯定会在某一时刻耗尽,您可以使用以下命令:
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)是非常邪恶的,但我发现在这样的情况下,它确实做了需要的事情。如果你想防止它的无限循环,你总是可以添加一个变量,每次迭代都递增,当它达到一个永远不会发生的高值时(如10 * count($array)),就执行break。
https://stackoverflow.com/questions/16626246
复制相似问题