你如何去除foreach循环中的数组元素?

我想用foreach循环访问一个数组来检查一个值是否存在。 如果该值确实存在,我想删除包含它的元素。

我有以下代码:

 foreach($display_related_tags as $tag_name) { if($tag_name == $found_tag['name']) { // Delete element } } 

一旦find值,我不知道如何删除元素。 我如何删除它?

我必须使用foreach来解决这个问题。 有可能是foreach替代品,欢迎您分享。

如果您还获得了密钥,则可以像这样删除该项目:

 foreach ($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag['name']) { unset($display_related_tags[$key]); } } 

更好的解决scheme是使用array_filter函数:

 $display_related_tags = array_filter($display_related_tags, function($e) use($found_tag){ return $e != $found_tag['name']; }); 

正如php文档所示:

由于foreach依赖于PHP 5中的内部数组指针,在循环中更改它可能会导致意外的行为。

 foreach($display_related_tags as $key => $tag_name) { if($tag_name == $found_tag['name']) unset($display_related_tags[$key]; } 

而不是在数组上执行foreach()循环,使用array_search()来查找正确的键会更快。 在小数组上,我会使用foreach来获得更好的可读性,但是对于更大的数组,或者经常执行的代码,这应该会更优化一些:

 $result=array_search($unwantedValue,$array,true); if($result !== false) { unset($array[$result]); } 

严格的比较运算符!==是需要的,因为array_search()可以返回0作为$ unwantedValue的索引。

另外,上面的例子将只删除第一个值$ unwantedValue,如果$ unwantedValue可以在$数组中出现多次,则应该使用array_keys()来查找所有这些值:

 $result=array_keys($array,$unwantedValue,true) foreach($result as $key) { unset($array[$key]); } 

检查http://php.net/manual/en/function.array-search.php获取更多信息。;

如果你的数组被索引(非关联),那么你可能想使用array_splice而不是unset,所以索引号被适当的重新sorting。

 foreach ($arr as $key => $value) { if($value == 'whatever') { array_splice($arr, $key, 1); } } 

例如,如果你有这个索引数组: $arr = [200,400,600];

  • 在第二个元素([1])中使用unset会导致下面的数组:
 array(2) { [0]=> int(200) [2]=> int(600) } 
  • 在第二个元素([1])中使用array_splice将导致以下数组:
 array(2) { [0]=> int(200) [1]=> int(600) } 

这避免了使用增量索引的循环的潜在问题。

尝试在循环中使用next()current()函数。

正如已经提到的,你会想要用关键字来做foreach,而不是使用关键字 – 但是请注意,在迭代期间对数组进行变异通常是一个坏主意,尽pipe我不确定PHP的规则如何副手。

如果你有这种情况下,你必须从foreach数组中删除多个值,那么你必须通过引用来传递值:我试图解释这种情况:

 foreach ($manSkuQty as $man_sku => &$man_qty) { foreach ($manufacturerSkus as $key1 => $val1) { // some processing here and unset first loops entries // here dont include again for next iterations if(some condition) unset($manSkuQty[$key1]); } } } 

在第二个循环中,您想取消设置第一个循环的条目,不要再次出现在性能目的的迭代中,否则就从内存中取消设置,因为它们在内存中存在,并且会迭代。