如何删除嵌套数组的一项? [复制]

Posted

技术标签:

【中文标题】如何删除嵌套数组的一项? [复制]【英文标题】:How to delete an item of a nested array? [duplicate] 【发布时间】:2021-12-02 16:18:42 【问题描述】:

我有一个这样的数组:

$arr = [
        ['id' => 12, 'name' => 'Martin', 'cellphone' => '0019949437'],
        ['id' => 15, 'name' => 'Alex', 'cellphone' => "00183847394"]
       ];

我需要从上面的数组中删除 cellphone 项目。我写了一个代码来做到这一点:

$res = array_filter($arr, function($arr) unset($arr['cellphone']); return $arr; );

但该项目仍然存在并且$res$arr 相同。怎么了?什么未设置不会发生?

【问题讨论】:

你为什么要尝试使用array_filter作为开始,这将是array_walk的更多用例。 unset 不起作用,因为 $arr 不是真实数组的引用。使用循环。 @CBroe 好吧,我想过滤数组中的一项。反正我也不知道,在这种情况下,数组映射或数组遍历可能是更好的选择。 array_filter 的目的是完全$arr 中删除项目 - 这不是您想要做的开始,您想要修改项目. 【参考方案1】:

array_filter

使用回调函数过滤数组元素

由于您试图更改嵌套数组,array_filter 将不起作用。

使用循环,类似foreach()array_walk() 应该没问题。


<?php

// Input
$arr = [
   ['id' => 12, 'name' => 'Martin', 'cellphone' => '0019949437'],
   ['id' => 15, 'name' => 'Alex', 'cellphone' => "00183847394"]
];

// Using foreach
foreach($arr as &$tmp) 
   unset($tmp['cellphone']);


// Same result, using array_map
array_walk($arr, function (&$tmp)  unset($tmp['cellphone']); );

// Show result
var_dump($arr);

这里我们循环$arr,使用&amp; to get the reference到更深的数组,并使用unset()删除cellphone

结果:

array(2) 
  [0]=>
  array(2) 
    ["id"]=>
    int(12)
    ["name"]=>
    string(6) "Martin"
  
  [1]=>
  &array(2) 
    ["id"]=>
    int(15)
    ["name"]=>
    string(4) "Alex"
  


Try it online!

【讨论】:

【参考方案2】:

使用array_map:它返回一个包含应用回调结果的数组

$arr = [
    ['id' => 12, 'name' => 'Martin', 'cellphone' => '0019949437'],
    ['id' => 15, 'name' => 'Alex', 'cellphone' => "00183847394"]
];

function unsetCellPhone($u)
  unset($u['cellphone']);
  return $u;


$res = array_map("unsetCellPhone", $arr);

print_r($res);

Demo

【讨论】:

以上是关于如何删除嵌套数组的一项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何删除数组中的项目? [复制]

java中 如何在一个数组中删除里面的元素

如何删除数组内的嵌套数组

如何使用 REST 从子文档数组中发布、修补和删除项目

如何使用 REST 从子文档数组中发布、修补和删除项目

如何更新(删除)嵌套数组中的文档