2010-11-18 12 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を格納することは賢明ではないでしょうか?(値が名前またはsomesuch)? – Orbling

答えて

0

これはDRYにすることができますが、それを処理するにはすばやく汚れた方法です。また、各子レコードに有効な親レコードがあり、有効な親レコードが元の配列の子レコードの前にあることを保証できる場合は、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

任意の深さのための作品と子供が親に先行することができます:

<?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構造を参照するには$nodes結果に。それはあなたが提案したものに近いです。主な違いは、キーがIDではないという点です。