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

时间:2009-12-22 21:22:45

标签: php arrays loops foreach

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

我有以下代码:

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

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

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

8 个答案:

答案 0 :(得分:189)

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

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

答案 1 :(得分:25)

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

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

正如php documentation所读:

  

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

     

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

答案 2 :(得分:9)

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

答案 3 :(得分:6)

不是在数组上执行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了解详情。

答案 4 :(得分:0)

正如已经提到过的,你想要使用密钥进行foreach,并使用密钥取消设置 - 但请注意,在迭代期间改变数组通常是一个坏主意,尽管我不确定PHP是什么这个随便的规则。

答案 5 :(得分:0)

尝试使用next()current()周期中的whilefor函数。

答案 6 :(得分:0)

如果您有必须从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]);

                        }
               }
}

在第二个循环中你要取消设置第一个循环条目不会再次出现在迭代中以达到性能目的,否则就会从内存中取消设置,因为在内存中它们会出现并将进入迭代。

答案 7 :(得分:0)

已经有答案可以解释如何解开。而不是在所有类中重复代码,使得函数如下所示,并在需要时在代码中使用它。在业务逻辑中,有时您不希望公开某些属性。请参阅下面的一个班轮电话删除

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