Мой входной массив
$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'),
);
Каков наилучший способ сделать это?
Честно быть честным. В 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;
}