基于单个值从多维数组中删除数组
Removing arrays from multi dimension array based on single values
我正在尝试通过删除 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()
和回调函数在第一层非常简单地做到这一点,但我无法找到一个简单的解决方案来在每一层都做到这一点。
目前我的解决方案是循环并取消设置每个键,但它需要知道数组的确切结构并且感觉很乱。
有点复杂。仅当数组没有比您给出的示例更深时才有效。
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]);
}
}
}
}
这是一个递归的方法。一些内联注释有助于解释,但没有太多解释基本功能不表达。
代码:(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',
),
),
),
)
我正在尝试通过删除 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()
和回调函数在第一层非常简单地做到这一点,但我无法找到一个简单的解决方案来在每一层都做到这一点。
目前我的解决方案是循环并取消设置每个键,但它需要知道数组的确切结构并且感觉很乱。
有点复杂。仅当数组没有比您给出的示例更深时才有效。
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]);
}
}
}
}
这是一个递归的方法。一些内联注释有助于解释,但没有太多解释基本功能不表达。
代码:(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',
),
),
),
)