154

我遍历一组对象,并希望根据它的“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
        } 
    }
}

有什么建议么。谢谢。

4

6 回答 6

259
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]);
        } 
    }
}
于 2010-02-21T02:56:58.600 回答
3

请注意主要答案。

[['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;
        }
    }
}
于 2020-04-18T11:50:38.743 回答
2

看起来您的 unset 语法无效,并且缺少重新索引可能会在将来造成麻烦。请参阅: 关于 PHP 数组的部分

正确的语法如上所示。还要记住用于重新索引的数组值,因此您永远不会索引以前删除的内容。

于 2010-02-21T02:58:43.323 回答
2

您还可以对foreach值使用引用:

foreach($array as $elementKey => &$element) {
    // $element is the same than &$array[$elementKey]
    if (isset($element['id']) and $element['id'] == 'searched_value') {
        unset($element);
    }
}
于 2015-06-09T12:17:56.323 回答
1

这应该可以解决问题......

reset($array);
while (list($elementKey, $element) = each($array)) {
    while (list($key, $value2) = each($element)) {
        if($key == 'id' && $value == 'searched_value') {
            unset($array[$elementKey]);
        }
    }
}
于 2013-02-07T18:54:32.047 回答
-1

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

于 2010-02-21T02:53:40.150 回答