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

ajs*_*sie 116 php arrays foreach loops

我想循环遍历数组foreach以检查是否存在值.如果值确实存在,我想删除包含它的元素.

我有以下代码:

foreach($display_related_tags as $tag_name) {
    if($tag_name == $found_tag['name']) {
        // Delete element
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我必须使用foreach这个问题.可能有替代品foreach,欢迎您分享.

Gum*_*mbo 203

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

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

  • 请看@Neils答案.您将遇到意外的错误,特别是如果您使用stdClasses数组.你喜欢意外的行为吗?我不是. (5认同)
  • 请注意,带有未设置项的索引数组可以在`json_encode()`之后表示为对象而不是数组.您可以使用`$ display_related_tags = array_values($ display_related_tags);`在`foreach`循环之后解决这个问题. (4认同)
  • 有关使用`$ key =>&$ tag_name`优化的一些其他信息http://stackoverflow.com/a/2008893/922522 (3认同)

Nei*_*ils 33

更好的解决方案是使用该array_filter功能:

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

正如php 文档所示:

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

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


Ste*_*e H 9

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

  • 'unlink'取消链接文件,它与变量无关,或者更具体地说,与数组无关.也许你的意思是'未设置'? (3认同)

小智 6

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

$result=array_search($unwantedValue,$array,true);
if($result !== false) {
  unset($array[$result]);   
}
Run Code Online (Sandbox Code Playgroud)

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

此外,上述例子只是删除第一个值$ unwantedValue,如果$ unwantedValue可以在$数组中出现多于一次,你应该用array_keys(),发现所有的人:

$result=array_keys($array,$unwantedValue,true)
foreach($result as $key) {
  unset($array[$key]);
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看http://php.net/manual/en/function.array-search.php.