Свести вложенный иерархический массив PHP в строковые представления - PullRequest
1 голос
/ 03 августа 2011

Учитывая массив:

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;
}

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

только что ответил на предыдущий вопрос всего за 5 минут, похожий на этот, что может дать вам лучшее понимание того, что вы делаете предыдущий ответил

0 голосов
/ 03 августа 2011

Мне понравился этот вызов, он должен это сделать:

<?php
$start = array(
    0 => array(
        '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"
            )
        )
    )
);

function recurse($data, $prefix = '') {
    $seperator = ($prefix == '' ? '' : ' > ');
    $return = array();
    if (is_array($data)) {
        foreach($data as $key => $value) {
            $return[$key] = $prefix . $seperator . $value['name'];
            $return = array_merge($return, recurse($value['children'],$prefix . $seperator . $value['name']));
        }
    }

    return $return;
}

print_r(recurse($start));
?>
...