根据单个值从多维数组中删除数组



我试图通过删除 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()与回调函数一起在第一个级别上做到这一点,但是我无法为在每个级别上执行它做一个简单的解决方案。

目前,我的解决方案正在循环和弄清每个键,但是它需要知道数组的确切结构,并且感觉很混乱。

这是一种具有递归的方法。一些内联评论可以帮助解释,但没有太多解释的基本功能并不能固有地表达。

代码:(演示)

$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',
      ),
    ),
  ),
)

有点复杂。仅当数组的深度比您给出的示例还要深时,才能起作用。

foreach($array as $key => $item) {
    if(isset($item['permission']) && $item['permission'] == 'no') {
        unset($array[$key]);
    }
    if(isset($item['dropdown'])) {
       foreach($item['dropdown'] as $key2 => $item2) {
            if(isset($item2['permission']) && $item2['permission'] == 'no') {
                unset($array[$key]['dropdown'][$key2]);
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新