如何从 foreach 循环中的数组中删除对象?

我迭代了一个对象数组,并希望基于它的“ id”属性删除其中一个对象,但是我的代码不起作用。

foreach($array as $element) {
foreach($element as $key => $value) {
if($key == 'id' && $value == 'searched_value'){
//delete this particular object from the $array
unset($element);//this doesn't work
unset($array,$element);//neither does this
}
}
}

有什么建议吗,谢谢。

171907 次浏览

我不是一个 PHP 程序员,但是我可以说在 C # 中你不能在迭代的时候修改一个数组。您可能想尝试使用 foreach 循环来标识元素的索引或要删除的元素,然后在循环之后删除元素。

foreach($array as $elementKey => $element) {
foreach($element as $valueKey => $value) {
if($valueKey == 'id' && $value == 'searched_value'){
//delete this particular object from the $array
unset($array[$elementKey]);
}
}
}

看起来您的 unset 语法是无效的,并且缺乏重新索引可能会在将来引起麻烦。见: PHP 数组一节

正确的语法如上所示。还要记住 数组值是用来重新建立索引的,这样你就永远不会索引你之前删除的内容。

这个应该可以..。

reset($array);
while (list($elementKey, $element) = each($array)) {
while (list($key, $value2) = each($element)) {
if($key == 'id' && $value == 'searched_value') {
unset($array[$elementKey]);
}
}
}

还可以对 foreach值使用引用:

foreach($array as $elementKey => &$element) {
// $element is the same than &$array[$elementKey]
if (isset($element['id']) and $element['id'] == 'searched_value') {
unset($element);
}
}

小心主要答案。

[['id'=>1,'cat'=>'vip']
,['id'=>2,'cat'=>'vip']
,['id'=>3,'cat'=>'normal']

并调用函数

foreach($array as $elementKey => $element) {
foreach($element as $valueKey => $value) {
if($valueKey == 'cat' && $value == 'vip'){
//delete this particular object from the $array
unset($array[$elementKey]);
}
}
}

它回来了

[2=>['id'=>3,'cat'=>'normal']

而不是

[0=>['id'=>3,'cat'=>'normal']

这是因为 unset 不会重新索引数组。

它会重新索引(如果我们需要的话)

$result=[];
foreach($array as $elementKey => $element) {
foreach($element as $valueKey => $value) {
$found=false;
if($valueKey === 'cat' && $value === 'vip'){
$found=true;
$break;
}
if(!$found) {
$result[]=$element;
}
}
}