2010-11-18 3 views
0
내가

PHP 재정렬 배열은 부모/ID 계층

[0] => Array 
    (
     [id] => 1 
     [parent_id] => 0 
     [name] => Accueil 
    ) 

[1] => Array 
    (
     [id] => 2 
     [parent_id] => 0 
     [name] => Exposants 
    ) 

[2] => Array 
    (
     [id] => 3 
     [parent_id] => 0 
     [name] => Visiteurs 
    ) 

[3] => Array 
    (
     [id] => 4 
     [parent_id] => 0 
     [name] => Medias 
    ) 

[4] => Array 
    (
     [id] => 5 
     [parent_id] => 0 
     [name] => Activités 
    ) 

[5] => Array 
    (
     [id] => 6 
     [parent_id] => 1 
     [name] => Contact 
    ) 

[6] => Array 
    (
     [id] => 7 
     [parent_id] => 3 
     [name] => Partenaires 
    ) 

[7] => Array 
    (
     [id] => 8 
     [parent_id] => 2 
     [name] => News 
    ) 

그래서 나는 ID와 PARENT_ID 필드 같이 계층 구조를 반영하는 배열 올 다음과 같은 배열을 재 배열하려면 어떻게

을 반영하기 위해? 배열 키는 배열 요소의 ID 필드입니다. 부모입니다. 이 배열 안에는 ID 필드를 키로 가지는 자식 배열이 매번 있습니다. 샘플 :

[1] => Array 
     (
      [name] => Accueil 
      [children] => array(
       [0] => bla, 
       [3]  => bla2 
      ) 
     ) 

    [2] => Array 
     (
      [name] => Something 
      [children] => array(
       [4] => bla3, 
      ) 
     ) 
+0

주 배열에 모든 "사람"이있는 경우 ID를 키/값으로 사용하는 대신 "어린이"키 아래에 ID를 저장하는 것이 현명하지 않을 수 있습니다 (값이 이름 또는 somesuch)? – Orbling

답변

0

당신은 이것을 더 빨리 만들 수 있지만, 그것을 다루는 빠르고 더러운 방법입니다. 또한 각 하위 레코드에 유효한 상위 레코드가 있고 올바른 부모 레코드가 원래 배열의 하위 레코드보다 앞에 오도록 보장 할 수 있으면 6 줄을 제거 할 수 있습니다.

$sorted = array(); 
foreach($orig_ary as $item) { 
    if ($item['parent_id'] === 0) { 
    if (!array_key_exists($item['id'], $sorted)) { 
     $sorted[ $item['id'] ] = array(
     'name' => '', 
     'children' => array() 
    ); 
    } 
    $sorted[ $item['id'] ]['name'] = $item['name']; 
    } else { 
    if (!array_key_exists($item['parent_id'], $sorted)) { 
     $sorted[ $item['parent_id'] ] = array(
     'name' => '', 
     'children' => array() 
    ); 
    } 
    $sorted[ $item['parent_id'] ]['children'][ $item['id'] ] = $item['name']; 
    } 
} 
2

어떤 깊이에 대한 작품과 아이들이 부모 앞에 할 수 있도록 다음 $nodes 결과에

<?php 
$p = array(0 => array()); 
foreach($nodes as $n) 
{ 
    $pid = $n['parent_id']; 
    $id = $n['id']; 

    if (!isset($p[$pid])) 
    $p[$pid] = array('child' => array()); 

    if (isset($p[$id])) 
    $child = &$p[$id]['child']; 
    else 
    $child = array(); 

    $p[$id] = $n; 
    $p[$id]['child'] = &$child; 
    unset($p[$id]['parent_id']); 
    unset($child); 

    $p[$pid]['child'][] = &$p[$id];  
} 
$nodes = $p['0']['child']; 
unset($p); 
?> 

사용 var_dump을 구조를 볼 수 있습니다. 당신이 제안한 것에 가깝습니다. 주요 차이점은 키가 ID가 아니라는 것입니다.