Учитывая массив:
0 => (
[parent_id] => null,
[name] => "Root"
[children] => array(
10 => array(
[parent_id] => 0,
[name] => "Category A",
[children] => array(
30 => array(
[parent_id] => 10,
[name] => "Category C"
)
)
),
20 => array(
[parent_id] => 0,
[name] => "Category B"
)
)
)
Мне нужно вернуть массив строковых представлений этих путей ...
array(
[0] => "Root",
[10] => "Root > Category A",
[30] => "Root > Category A > Category C",
[20] => "Root > Category B"
)
Я возился, делая это рекурсивно, ноУ меня возникли проблемы с эффективностью.Есть ли простые способы сделать это, что я просто пропускаю?
РЕДАКТИРОВАТЬ:
Решение - это просто слегка измененная версия ответа Александра Вервейка.Несколько настроек для обработки несуществующих потомков, рекурсивный вызов функции с помощью константы FUNCTION , поэтому легко изменить имя функции и перейти от array_merge к оператору +, чтобы объединить массивы для сохранения ключей.
function flatten($data, $prefix = "", $item_seperator = "/") {
$seperator = $prefix == "" ? "" : $item_seperator;
$return = array();
if (is_array($data)) {
foreach($data as $key => $value) {
$return[$value["endeca_id"]] = $prefix . $seperator . $value["url_key"];
if(array_key_exists("children", $value))
{
$return = $return + call_user_func(__FUNCTION__, $value["children"], $prefix . $seperator . $value["url_key"], $item_seperator);
}
}
}
return $return;
}