Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何删除foreach循环中的数组元素?_Php_Arrays_Loops_Foreach - Fatal编程技术网

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

Php 如何删除foreach循环中的数组元素?,php,arrays,loops,foreach,Php,Arrays,Loops,Foreach,我想使用foreach遍历一个数组,以检查值是否存在。如果该值确实存在,我想删除包含它的元素 我有以下代码: foreach($display_related_tags as $tag_name) { if($tag_name == $found_tag['name']) { // Delete element } } 我不知道在找到值后如何删除元素。如何删除它 对于这个问题,我必须使用foreach。对于foreach,可能有其他选择,欢迎您分享。如果您也获得

我想使用
foreach
遍历一个数组,以检查值是否存在。如果该值确实存在,我想删除包含它的元素

我有以下代码:

foreach($display_related_tags as $tag_name) {
    if($tag_name == $found_tag['name']) {
        // Delete element
    }
}
我不知道在找到值后如何删除元素。如何删除它


对于这个问题,我必须使用
foreach
。对于
foreach
,可能有其他选择,欢迎您分享。

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

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

如前所述,您可能希望使用键执行foreach,并使用键取消设置–但是请注意,在迭代过程中改变数组通常是个坏主意,尽管我不确定PHP在这方面的规则。

使用array\u search()比在数组上执行foreach()循环更快找到合适的钥匙。在小数组上,为了更好的可读性,我会使用foreach,但对于更大的数组或经常执行的代码,这应该是更优化的:

$result=array_search($unwantedValue,$array,true);
if($result !== false) {
  unset($array[$result]);   
}
严格比较运算符!==是必需的,因为数组_search()可以返回0作为$unwantedValue的索引

此外,上面的示例将仅删除第一个值$UNWNTEDVALUE,如果$UNWNTEDVALUE可以在$array中出现多次,则应使用array_keys()来查找所有值:

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

查看更多信息。

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

                        }
               }
}

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

更好的解决方案是使用以下功能:

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

php foreach将在整个数组上执行。测试取消设置迭代中下一个值。它将在偏移量上迭代,但值将为null。如果在迭代过程中不改变数组,那么如何改变数组呢?一般来说,可能是指
foreach
for
构造,而不是迭代?这更多的是对另一个答案的注释,而不是答案本身。“unlink”取消文件链接,它与变量或更具体地说,数组无关。也许您的意思是“unset”?关于使用
$key=>&$tag\u name进行优化的一些附加信息请注意,带有未设置项的索引数组可能表示为对象,而不是
json\u encode()后的数组。您可以使用
$display\u related\u tags=数组值($display\u related\u tags)解决此问题foreach
循环之后添加code>。注意,这里的技巧是向foreach循环添加一个值;-)请看@Neils的答案。您将遇到意外的bug,尤其是在使用stdclass数组时。你喜欢出人意料的行为吗?“我不是。”快乐的狨猴尼尔的回答没有帮助。Snippet
$projects=array\u filter($projects,function($project){returncount($project->roles)>0;})它将结果转换为对象。请注意,第三个参数应该是ARRAY\u FILTER\u USE\u KEY,以便在此处以$e的形式传递密钥。@namezero确定为什么这在这里很重要?@abracadver来自文档():
ARRAY\u FILTER\u USE\u KEY-pass KEY作为回调的唯一参数,而不是value数组\u FILTER\u USE\u BOTH-pass value和KEY作为回调的参数,而不是value
默认值为0,它将把value作为回调的唯一参数
也就是说,在这种情况下,再次阅读答案当然不会像您声称的那样重要。重要的是,如果您有兴趣将数组保持为有序数组,则需要调用
display_related_tags=array_values(display_related_tags)数组_过滤器
要精简得多(我不确定后台的实际实现)。
removeKeysFromAssociativeArray($arrValues, $keysToRemove);