如何在 foreach 循环中删除数组元素?

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

我有以下密码:

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

我不知道如何删除一旦找到值的元素。我该如何删除它?

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

174523 次浏览

如果你也得到了密钥,你可以像下面这样删除它:

foreach ($display_related_tags as $key => $tag_name) {
if($tag_name == $found_tag['name']) {
unset($display_related_tags[$key]);
}
}
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 中出现多次,那么应该使用 array _ keys ()来查找所有值:

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

有关更多信息,请查看 http://php.net/manual/en/function.array-search.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]);


}
}
}

在第二个循环中,出于性能考虑,您希望取消第一个循环的设置条目不会再次出现在迭代中,否则也会从内存中取消设置,因为在内存中,它们出现并将在迭代中出现。

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

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

正如 php 文件所说:

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

在 PHP7中,foreach 不使用内部数组指针。

现在已经有了一些答案,可以说明如何取消设置。与其在所有类中重复代码,不如创建如下函数,并在需要时在代码中使用它。在业务逻辑中,有时您不希望公开某些属性。请参阅以下一个班轮调用删除

public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset)
{
if (empty($associativeArray) || empty($keysToUnset))
return array();


foreach ($associativeArray as $key => $arr) {
if (!is_array($arr)) {
continue;
}


foreach ($keysToUnset as $keyToUnset) {
if (array_key_exists($keyToUnset, $arr)) {
unset($arr[$keyToUnset]);
}
}
$associativeArray[$key] = $arr;
}
return $associativeArray;
}

打电话给我:

removeKeysFromAssociativeArray($arrValues, $keysToRemove);