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

Posted

技术标签:

【中文标题】如何从foreach循环php中的对象数组中删除对象【英文标题】:how to remove object from array of objects in foreach loop 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 检查人民代表,然后就很清楚了。 【参考方案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 查询的更多信息,您可以在下面的手册中阅读。


手册

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

PHP: JSON

PHP: json_decode

PHP: json_encode

mysql Documentation


在线编译器

您可以查看它是如何工作的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>';

【讨论】:

作为问题的作者,我也很震惊地注意到这一点。但你们真的帮助了我。

以上是关于如何从foreach循环php中的对象数组中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

如何从 forEach 循环中的数组中删除元素?

使用PHP与2个foreach循环中的数组进行比较时如何获取迭代次数

php foreach怎样获取当前的循环次数

如何使用 php 函数在数组中查找项目及其后的项目

将数据从 javascript forEach 循环中的 php 数组发送到 ajax 调用的 url

js 数组遍历时删除元素