PHP-通过给定的键路径(在另一个数组中)从数组中删除项


PHP - Remove item from array by given key paths (in another array)

这里有一个问题需要解决。将有两个阵列:

<?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
        )
)