У меня есть массив вроде следующего:
массив
(
[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
)
)
Я заменил глобальную переменную $ 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']);
Если ваш код работает в примере данных не дает примеры результатов, то, пожалуйста, напишите, какой массив он делает иначе.