2013-05-18 24 views
0

遇到一个小问题,并想知道是否有围绕它的“最佳实践”方式。Foreach和未设置()

所以我刚刚得知:“一个php的foreach将会在整个数组上执行,不管在迭代中测试下一个值,它会迭代偏移量,但是这个值将是空值 - Kevin Peno Dec 22 '09 at 21:31“from 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]); 
    } 
} 

所以在第一次循环,它使用$数组[0]很明显,但在$ SearchResult所可能返回4,5,6,7。所以这些密钥从$ array中删除。

然而,foreach循环仍然遍历这些循环,并给了我一堆空阵列。

我的确读过How does PHP 'foreach' actually work?,我弄明白了。

感谢

+1

你可以在迭代时删除想要的项目一个if子句 – Fabio

+0

@Fabio是怎么回事?我只是添加了一个if(空($ array))语句,并且至少删除了所有空数组。我想我更感兴趣的是使它不会迭代那些因为它们未被设置。或者这只是一种怪癖。 – TheEditor

+0

你需要在第一阶段删除什么? – Fabio

回答

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); 
+0

尝试使用array_diff_key和相同的东西。当foreach循环开始时,有一个原始的50个元素。无论我尝试过它,它都会经历全部50.除非我在if(empty($ array))条件下断开循环。 – TheEditor

+0

如果你使用array_diff,那么你不需要遍历数组 - 循环遍历它一次来建立一个你想要删除的索引列表,然后在你离开循环后,将数据数组与你的元素进行比较希望删除。 – StampyCode

+0

我必须循环,这就是搜索的运行方式。我明白你的观点,但在这种情况下不起作用。我需要继续循环播放数组,直到它耗尽为止,尽管现在有点麻烦。 – TheEditor

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)是非常邪恶的,但我觉得在这样的情况下,确实需要什么。 如果你想阻止它无限循环,你总是可以添加一个变量,增加每次迭代,并且当它达到一个不应该发生的高值时(如10 * count($array)

+0

我会给你一个镜头。看起来比if(!empty($ array))break更干净。请原谅我的无知,但为什么是(真)邪恶?不是我曾经使用过它,只是为了学习。 – TheEditor

+0

因为如果你永远不会“破译”脚本将永远运行(当然,除非它达到时间限制) – rpkamp