【问题标题】:how to remove object from array of objects in foreach loop php如何从foreach循环php中的对象数组中删除对象
【发布时间】:2017-04-13 10:42:16
【问题描述】:

我有一个从数据库返回的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",
    },
]

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

我想用一个 foreach 循环来做到这一点。请问我该怎么做或有什么更好的方法可以做到这一点?

【问题讨论】:

  • 为什么不首先从表中选择“管理员”行?
  • 不知道这里发生了什么,但有人对下面的答案投了反对票。检查我们的解决方案并提供反馈;)
  • @KarolGasienica 检查人民代表,然后就很清楚了。

标签: php arrays loops object foreach


【解决方案1】:

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

$users = array_filter(json_decode($users), function($user) {
    return $user->category != 'user';
});

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

【讨论】:

  • 如果只使用回调函数中的值,为什么这里需要ARRAY_FILTER_USE_BOTH
  • 不管怎样,这是最适合的答案,不知道为什么它被否决。其他答案只是重新发明array_filter 功能。
  • 好吧,技术上的问题要求foreach 循环解决方案。此外,这种方法不能在原地工作,如果阵列很大,这可能会很糟糕。我怀疑其中任何一个都是实际原因,但有人在这里地毯式否决了答案。也许有人会发布(或已经发布)他的答案。
【解决方案2】:

我猜这个数组是 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

输出

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"
    }
}

编辑

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

【讨论】:

  • 如果要重置密钥也可以在末尾添加$array = array_values($array)
  • @maestroosram 如果密钥需要重置……他可能需要它们在代码的其他地方进行参考。
  • 如果管理员的name"user" 怎么办?该元素将从结果数组中删除,尽管类别为"admin"。更进一步,您不会在取消设置元素后中断内部循环。
  • @Kitson88,它会工作的。但是为什么你需要这个嵌套循环,当你可以得到这样的类别$v['category']?如果是出于担心,将没有密钥category,您可以使用isset($v['category']) 进行检查。
  • @Kitson88,正如我在其他评论中所写的那样,大师级解决方案是最好的。但无论出于何种原因,有人对所有答案都投了反对票,他的答案得到了-1。这是一种耻辱。如今,当您可以避免显式循环时,通常最好这样做。
【解决方案3】:

您的输入看起来像JSON,因此您可以使用json_decode 函数将其变成一个数组,您可以使用foreach,如果需要,您可以将其编码(json_encode)回JSON相同的输出。


解决方案

下面的代码应该对你有用:

<?php
// $json = output from your db
$json_output = json_decode($json, true);

foreach ($json_output as $user) {
    if ($user['category'] == 'admin') { // or it may be $user['category'] != 'user'
        $user_output[] = $user;
    }
}
print_r($user_output);
print_r(json_encode($user_output, true)); // if you want json output    
?>

SQL

您还可以在 SQL 查询中添加WHERE 语句。它可能如下所示:

SELECT * FROM users WHERE category = 'admin'

当然查询取决于您在表中的名称。有关SELECT 查询的更多信息,您可以在下面的手册中阅读。


手册

您可以在下面阅读有关使用方法的更多信息:


在线编译器

您可以查看它是如何工作的here

【讨论】:

    【解决方案4】:

    如果您只想删除类别“用户”,您只需获取密钥并为删除该类别设置条件并将类别“管理员”放在该新数组中。看看这个:

    $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"
    }]';
    
    $arr = json_decode($json, true);
    
    $newArr = array();
    foreach($arr as $key => $value) {
        if($value["category"] == "admin") {
            $newArr[] = $value;
        }
    }
    
    echo '<pre>';
        print_r($newArr);
    echo '</pre>';
    

    【讨论】:

    • 作为问题的作者,我也很震惊地注意到这一点。但你们真的帮助了我。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2023-01-16
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多