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

Awa*_*ine 6 php arrays foreach loops object

我有一个users从数据库返回的对象,如下所示:

[
    {
        "id":1,
        "name":"Bob",
        "category":"admin",
        "email":"test1@test.com",
        "phone":"123456789",
        "gender":"male",
    },
    {
        "id":2,
        "name":"John",
        "category":"user",
        "email":"john@test.com",
        "phone":"123456789",
        "gender":"male",
    },
    {
        "id":3,
        "name":"Jane",
        "category":"admin",
        "email":"jane@test.com",
        "phone":"123456789",
        "gender":"female",
    },
]
Run Code Online (Sandbox Code Playgroud)

现在我想循环遍历所有users对象并删除其category属性为的所有用户,user以便生成的users对象仅保留admin类别.

我想用foreach循环来做这个.请问我该如何解决这个问题,或者我有什么更好的方法来实现这个目标?

mae*_*ram 5

假设数组是json格式,一行代码:

$users = array_filter(json_decode($users), function($user) {
    return $user->category != 'user';
});
Run Code Online (Sandbox Code Playgroud)

如果它已经是一个有效的PHP数组,只需删除 json_decode()

  • 无论如何,这是最合适的答案,不知道为什么会被投票.其他答案只是重新发明`array_filter`函数. (3认同)
  • 好吧,从技术上讲,问题是`foreach`循环解决方案.而且,这种方法不能就地工作,如果数组很大,这可能会很糟糕.我怀疑其中任何一个都是真正的原因,但有人在这里找到了满满的答案.也许有人会发布(或已经发布)他的答案. (2认同)

Kit*_*n88 3

我猜数组是 JSON 格式?不管怎样..我修复了你无效的 JSON,所以你应该能够看到它是如何完成的。

$json = '

[{
    "id": 1,
    "name": "Bob",
    "category": "admin",
    "email": "test1@test.com",
    "phone": "123456789",
    "gender": "male"
}, {
    "id": 2,
    "name": "John",
    "category": "user",
    "email": "john@test.com",
    "phone": "123456789",
    "gender": "male"
}, {
    "id": 3,
    "name": "Jane",
    "category": "admin",
    "email": "jane@test.com",
    "phone": "123456789",
    "gender": "female"
}]

';

$array = json_decode($json, true); //Fixed and converted JSON into PHP Assoc Array 

foreach($array as $k=>$v) { 
    foreach ($array[$k] as $key=>$value) { 
      if ($key === "category" && $value === "user") { //If Value of 2D is equal to user and cat

          unset($array[$k]); //Delete from Array 
      }
    }  
}

var_dump($array); //Output Array
Run Code Online (Sandbox Code Playgroud)

输出

array(2) {
    [0] => array(6) {
        ["id"] => int(1)["name"] => string(3)
        "Bob" ["category"] => string(5)
        "admin" ["email"] => string(14)
        "test1@test.com" ["phone"] => string(9)
        "123456789" ["gender"] => string(4)
        "male"
    }[2] => array(6) {
        ["id"] => int(3)["name"] => string(4)
        "Jane" ["category"] => string(5)
        "admin" ["email"] => string(13)
        "jane@test.com" ["phone"] => string(9)
        "123456789" ["gender"] => string(6)
        "female"
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

*正如 @sevavietl 在评论中指出的那样,如果数组的任何其他元素被称为 user,那么它将被删除。我已更改代码以现在测试键(类别)以及值。*

  • @Kitson88,正如我在其他评论中所写的,maestroosram 解决方案是最好的。但无论出于何种原因,有人对所有答案都投了否决票,他的答案得到了-1。这是一种耻辱。如今,当您可以避免显式循环时,通常最好这样做。 (2认同)