Как сделать многомерный массив на основе родительского?

0

Мой входной массив

$data = array(
  array('department'=>'a', 'parent'=>'0'),
  array('department'=>'b', 'parent'=>'0'),
  array('department'=>'c', 'parent'=>'0'),
  array('department'=>'aa', 'parent'=>'a'),
  array('department'=>'bb', 'parent'=>'b'),
  array('department'=>'cc', 'parent'=>'c'),
  array('department'=>'aaa', 'parent'=>'a'),
  array('department'=>'bbb', 'parent'=>'b'),
  array('department'=>'ccc', 'parent'=>'c'), 
  array('department'=>'aa1', 'parent'=>'aa'),
  array('department'=>'bb1', 'parent'=>'bb'),
  array('department'=>'cc1', 'parent'=>'cc'),
  array('department'=>'aa2', 'parent'=>'aa'),
  array('department'=>'bb2', 'parent'=>'bb'),
  array('department'=>'cc2', 'parent'=>'cc'),

);

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

$result = array(
'a' => array('aa'=> array('aa1','aa2'),'aaa'),
'b' => array('bb'=> array('bb1','bb2'),'bbb'),
'c' => array('cc'=> array('cc1','cc2'),'ccc'),
);

Каков наилучший способ сделать это?

Теги:
arrays

1 ответ

1

Честно быть честным. В SO есть несколько вопросов, которые затрагивают аналогичные проблемы. Лучший способ решить эту проблему (на мой взгляд) - построить дерево.

Создание дерева из плоского массива в PHP

создать массив из списка массивов

Используя ответы на эти вопросы, я придумал решение, которое может вам подойдет.

Во-первых, я строю дерево, используя код, предоставленный в этих ответах. К сожалению, для правильного построения дерева у вас должно быть поле "department" в каждом подмассиве, и результирующий массив не имеет требуемого структурированного. Это причина, по которой я добавил второй метод, который рекурсивно идет по дереву, чтобы дать ему желаемый формат.

$new = array();
foreach ($data as $a) {
    $parent = $a['parent'];
    unset($a['parent']);// We don't need this anymore
    $new[$parent][] = $a;
}
$tree = giveMeFormattedArray($new, $new[0]); // changed
print_r($tree);

function giveMeFormattedArray($a, $ele) {
    $arr = createTree($a, $ele);// Create the Tree in the first place.
    return parseTree($arr);// Parse the result and return the desired format.
}

function parseTree(&$arr) {
    $res = array();
    foreach($arr as $key => $el) {
        $res[$key] = isset($el["children"]) ? parseTree($el["children"]) : $el["department"];
    }
    return $res;
}

function createTree(&$list, $parent) {
    $tree = array();
    foreach ($parent as $k => $l) {
        if (isset($list[$l['department']])) {
            $l['children'] = createTree($list, $list[$l['department']]);
        }
        $tree[$l['department']] = $l;
    }
    return $tree;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню