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