php - 基于单个值从多维数组中删除数组

标签 php recursion multidimensional-array filter array-unset

我正在尝试通过删除 permission 值为 no 的子数组来过滤多维数组。

我的数组:

$array = array(
    array(
        'name' => 'dashboard',
        'permission' => 'yes'
    ),
    array(
        'name' => 'Purchase Orders',
        'permission' => 'yes',
        'dropdown' => array(
            array(
                'name' => 'View Complete',
                'permission' => 'yes'
            ),
            array(
                'name' => 'New PO',
                'permission' => 'no'
            )
        )
    ),
    array(
        'name' => 'dashboard',
        'permission' => 'no'
    )
);

这是我想要的结果:(注意所有具有 permission=>'no' 的组都已被完全删除)

$array = array(
    array(
        'name' => 'dashboard',
        'permission' => 'yes'
    ),
    array(
        'name' => 'Purchase Orders',
        'permission' => 'yes',
        'dropdown' => array(
            array(
                'name' => 'View Complete',
                'permission' => 'yes'
            )
        )
    )
);

array_filter() 与回调函数一起使用可以在第一层非常简单地完成此操作,但我无法想出一个简单的解决方案来在每个级别上执行此操作。

目前我的解决方案是循环并取消设置每个键,但它需要知道数组的确切结构并且感觉很乱。

最佳答案

这是一个递归的方法。一些内联注释有助于解释,但没有太多解释基本功能本身不表达。

代码:(Demo)

$array = array(
array(
    'name' => 'dashboard',
    'permission' => 'yes'
),
array(
    'name' => 'Purchase Orders',
    'permission' => 'yes',
    'dropdown' => array(
        array(
            'name' => 'View Complete',
            'permission' => 'yes'
        ),
        array(
            'name' => 'New PO',
            'permission' => 'no'
        )
    )
),
array(
    'name' => 'dashboard',
    'permission' => 'no'
));

function recursive_filter($array){
    foreach($array as $k=>&$subarray){  // make modifiable by reference
        if(isset($subarray['permission']) && $subarray['permission']=='no'){ // check that this element exists before trying to access it
            unset($array[$k]);  // remove subarray
        }elseif(isset($subarray['dropdown'])){  // check that this element exists before trying to access it
            $subarray['dropdown']=recursive_filter($subarray['dropdown']);  // recurse
        }
    }
    return $array;
}

var_export(recursive_filter($array));

输出:

array (
  0 => 
  array (
    'name' => 'dashboard',
    'permission' => 'yes',
  ),
  1 => 
  array (
    'name' => 'Purchase Orders',
    'permission' => 'yes',
    'dropdown' => 
    array (
      0 => 
      array (
        'name' => 'View Complete',
        'permission' => 'yes',
      ),
    ),
  ),
)

关于php - 基于单个值从多维数组中删除数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47763334/

相关文章:

php - 发送 APNS 千台设备 php 花费太多时间

php - 如何使用ups api获取pdf格式的标签?以及如何直接在网络上打印?(php)

java - 四叉树的前序遍历

算法设计技术

javascript - JavaScript 中的函数式递归方法?不良做法?

c - 在 C 中填充动态二维数组时出现段错误

php - 写入数据库失败 : CakePhp Tuto

php - 电子邮件发送正常,但我收到消息 $body 未定义?

c# - 是否可以将 Canvas 中的形状添加到二维数组,其中二维数组位置是下方的网格控件单元格的位置?

java - 如何修复 java 中对特定行和列求和的加法?