Как можно изменить 2-мерный многомерный массив на n уровней?

У меня есть массив вроде следующего:

  массив
 (
     [1g27] => Массив
         (
             [42] => AAAAA
             [52] => BBBBB
             [4] => 2g4
         )
     [2g4] => Массив
         (
             [9] => CCCCC
             [14] => 3g14
             [15] => 3g15
             [20] => DDDDD
             [34] => EEEEE
         )
     [3g14] => Массив
         (
             [49] => FFFFF
         )
     [3g15] => Массив
         (
             [50] => GGGGG
         )
 )

Я бы хотел, чтобы он стал массивом следующего вида:

  массив
 (
     [1g27] => Массив
         (
             [42] => AAAAA
             [52] => BBBBB
             [2g4] => Массив
             (
                 [9] => CCCCC
                 [3g14] => Массив
                 (
                     [49] => FFFFF
                 )
                 [3g15] => Массив
                 (
                     [50] => GGGGG
                 )
                 [20] => DDDDD
                 [34] => EEEEE
         )
 )

Обратите внимание, что значения исходного массива также являются ключами, найденными в исходном массиве. Когда есть совпадение между значением и массивом, я хочу, чтобы массив заменил значение (и переименовал ключ этого значения).

Я пробовал foreach и array_walk_recursive, но я не могу понять это. (См. Следующую попытку, которая идет только на 1 уровень глубины.)

 функция inflate ($ flatree, $ array)
     {
     глобальные $ inflatedtree;
     foreach ($ array as $ arraykey => $ arrayvalue)
         {
         $ inflatedtree [$ arraykey] = $ arrayvalue;
         if (array_key_exists ($ arrayvalue, $ flatree))
             {
             $ inflatedtree [$ arrayvalue] = $ flatree [$ arrayvalue];
             надуть ($ flatree, $ inflatedtree [$ arrayvalue]);
             }
         }
     }
 надуть ($ flatree, $ flatree ['1g27']);

однако использование этой функции дает мне следующее:

  массив
 (
     [42] => AAAAA
     [52] => BBBBB
     [2g4] => Массив
         (
             [9] => CCCCC
             [14] => 3g14
             [15] => 3g15
             [20] => DDDDD
             [34] => EEEEE
         )

     [3g14] => Массив
         (
             [49] => FFFFF
         )
     [3g15] => Массив
         (
             [50] => GGGGG
         )
 )

Related of "Как можно изменить 2-мерный многомерный массив на n уровней?"

Я заменил глобальную переменную $ inflatedtree на локальную, которая является возвращаемым значением функции inflate (). Это возвращаемое значение – это новая ветка построения.

 function inflate($flatree, $array) { $inflatedtree = array(); foreach ($array as $arraykey => $arrayvalue) { if (array_key_exists($arrayvalue, $flatree)) { $inflatedtree[$arrayvalue] = inflate($flatree, $flatree[$arrayvalue]); } else { $inflatedtree[$arraykey] = $arrayvalue; } } return $inflatedtree; } 

Я использую функцию start () для первоначального вызова, чтобы вернуть массив по желанию. Calling inflate () напрямую вернет внутренний массив.

 function start($flatree, $key) { return array($key => inflate($flatree, $flatree[$key])); } $result_tree = start($flatree, '1g27'); 

Я не вижу причины, по которой ваш код должен идти только на один уровень. Кажется, что вы вызываете рекурсивную функцию должным образом. Единственная ошибка заключается в том, что ключ не переименован, а скопирован в новое имя. Вам нужно удалить старое значение, подобное этому

 function inflate($flatree, $array) { global $inflatedtree; foreach ($array as $arraykey => $arrayvalue) { $inflatedtree[$arraykey] = $arrayvalue; if (array_key_exists($arrayvalue, $flatree)) { unset($inflatedtree[$arraykey]); //now the new stuff is only at $arrayvalue, not $arraykey $inflatedtree[$arrayvalue] = $flatree[$arrayvalue]; inflate($flatree, $inflatedtree[$arrayvalue]); } } } inflate($flatree, $flatree['1g27']); с function inflate($flatree, $array) { global $inflatedtree; foreach ($array as $arraykey => $arrayvalue) { $inflatedtree[$arraykey] = $arrayvalue; if (array_key_exists($arrayvalue, $flatree)) { unset($inflatedtree[$arraykey]); //now the new stuff is only at $arrayvalue, not $arraykey $inflatedtree[$arrayvalue] = $flatree[$arrayvalue]; inflate($flatree, $inflatedtree[$arrayvalue]); } } } inflate($flatree, $flatree['1g27']); 

Если ваш код работает в примере данных не дает примеры результатов, то, пожалуйста, напишите, какой массив он делает иначе.