如何将数组添加到某个关键元素的多维数组中

时间:2015-03-20 11:12:35

标签: php arrays multidimensional-array

给定一个表示目录结构的多维数组,我想在某个关键元素处插入一个新项目。

这是数组:

$array = [
    [
        'key'=> 'b005f8da-208a-406a-8710-48dd5d3e598b',
        'title' => 'Title',
    ],
    [
        'key'=> 'ca0cd753-1f25-4e1a-b6fc-2e8c0e3aed0e',
        'title' => 'Title',
        'children' => [
            [
                'key'=> '605d755a-1ca0-4541-b24e-442bf19d432b',
                'title' => 'Title',
            ],
            [
                'key'=> 'b8d000a1-5ec4-469d-98aa-6f46647df611',
                'title' => 'Title',
                'children' => [
                    [
                        'key'=> '526b6329-6702-4e8b-83a8-564ba9044ff2',
                        'title' => 'Title',
                        'children' => [
                            [
                                'key'=> '0450f55f-88ec-476b-a317-f9c51f55baef',
                                'title' => 'Title',
                            ],
                            [
                                'key'=> 'a7f04948-9ef6-4dbc-9350-6db8ced30f01',
                                'title' => 'Title of target parent element',
                            ],
                            [
                                'key'=> 'c8e9e177-0be7-4d31-ad57-8d0677efae7f',
                                'title' => 'Title',
                            ], 
                        ],
                    ],
                ],
            ],
            [
                'key'=> '4aa9b0f4-1c75-4078-a1ec-4a92da20f14e',
                'title' => 'Title',
            ], 
        ],
    ],
];

这是目标键和新元素:

$targetKey = 'a7f04948-9ef6-4dbc-9350-6db8ced30f01';
$newItem = [
    'key' => '8eb51f08-c8e2-47b0-9281-8c689649e8bf',
    'title' => 'Title of new element',
];

将新元素作为目标元素的子元素(子数组中的元素)插入的最佳方法是什么?

$array可以有任意数量的嵌套级别。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

我自己使用以下递归函数找到了解决方案。

function insertItem(array &$array, $key, array $newItem) {
    foreach($array as $k => &$v) {
        if(is_array($v)) {
            if(array_key_exists('key', $v) && $v['key'] == $key){
                $v['children'][] = $newItem;
                return true;
            }

            if(array_key_exists('children', $v)) {
                $res = insertItem($v['children'], $key, $newItem);
                if($res) return $res;
            }
        }
    }
}

insertItem($array, $targetKey, $newItem);

答案 1 :(得分:-1)

试试这个:

foreach($array AS $arr)
{
   if($arr['key'] == 'a7f04948-9ef6-4dbc-9350-6db8ced30f01')
   {
      $arr[] = array('key' => '8eb51f08-c8e2-47b0-9281-8c689649e8bf','title' => 'Title of new element',);
      break;
   }
}

答案 2 :(得分:-1)

这是一个例子,给你一个想法:

function recursiveKeyTargeting($array, $target_key, $element_to_add)
{
    foreach($array AS $arr)
    {
      if(is_array($arr['key']))
      {
          recursiveKeyTargeting($array['key'], $target_key, $element_to_add);
      }
      else if($arr['key'] == $target_key)
      {
         $arr[] = $element_to_add;
        break;
      }
   }
}