这里有一个问题需要解决。将有两个阵列:
<?php
$main_array = array(
'item-1' => array(
'item-1-1' => array(
'item-1-1-1' => 'value',
'item-1-1-2' => 'value',
),
'item-1-2' => 'value'
),
'item-2' => 'value',
'item-3' => array(
'item-3-1' => array(
'item-3-1-1' => 'value',
'item-3-1-2' => 'value',
),
'item-3-2' => 'value',
),
);
$key_paths_to_deleted = array(
array('item-1', 'item-1-1', 'item-1-1-1'),
array('item-2'),
array('item-3', 'item-3-1'),
);
我需要从$key_paths_to_deleted
中给出的基于$main_array
的索引路径中删除项。因此得到的CCD_ 3应该如下所示。
$main_array = array(
'item-1' => array(
'item-1-1' => array(
'item-1-1-2' => 'value',
),
'item-1-2' => 'value'
),
'item-3' => array(
'item-3-2' => 'value',
),
);
这意味着我将拥有主数组中要删除的项的"路径"。
主数组中的键和值可以是PHP中任何可能的值,键没有结构化命名,值可能是重复的。
提前谢谢。
函数remove()
是递归的,将检查参数中的键。如果找到密钥,它将删除它。
参数$last
指示它是否是最后一个键。在您的示例中,它将删除item-3-1
的所有内容,但不会删除item-3
function remove(&$array, $remove, $last = false)
{
foreach($array as $key => &$value) {
if(is_array($value)) remove($value, $remove, $last);
if(is_array($value) && $key == $remove && $last == true) unset($array[$key]);
if( !is_array($value) && $key == $remove) unset($array[$key]);
}
}
for ( $i = 0 ; $i < count($key_paths_to_deleted) ; $i++ )
{
$last = count($key_paths_to_deleted[$i]) - 1;
for ( $j = $last; $j >= 0 ; $j-- )
remove($main_array, $key_paths_to_deleted[$i][$j], ( $j == $last ) ? true : false);
}
结果:
Array
(
[item-1] => Array
(
[item-1-1] => Array
(
[item-1-1-2] => value
)
[item-1-2] => value
)
[item-3] => Array
(
[item-3-2] => value
)
)