我试图通过删除 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]);
}
}
}
}