你如何去除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]); } } }
在第二个循环中,您想取消设置第一个循环的条目,不要再次出现在性能目的的迭代中,否则就从内存中取消设置,因为它们在内存中存在,并且会迭代。