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)那么,我们现在可以说,在PHP7中,直接从数组中取消设置项是安全的吗?至少从编码人员的角度来看,它显然比使用数组_过滤器
要精简得多(我不确定后台的实际实现)。
removeKeysFromAssociativeArray($arrValues, $keysToRemove);