2015-02-02 3 views
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'), 
); 

가장 좋은 방법은 무엇입니까?

답변

1

정직한 비트. 비슷한 문제를 해결하기 위해 여기에 몇 가지 질문이 있습니다. 이 문제를 해결하는 가장 좋은 방법은 트리를 만드는 것입니다. 이 질문에 답변을 사용

Build a tree from a flat array in PHP

create array tree from array list

나는 당신에 맞게 수있는 솔루션을 함께했다.

처음에는 이러한 답변에 제공된 코드를 사용하여 트리를 작성합니다. 불행히도, 트리를 적절하게 만들기 위해서는 모든 하위 배열에 '부서'필드가 있어야하며 결과 배열에는 필요한 구조화 된 배열이 없습니다. 그것이 내가 원하는 형식을 제공하기 위해 반복적으로 트리를 넘나 드는 두 번째 방법을 추가 한 이유입니다.

$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; 
} 
관련 문제