2011-11-05 5 views
5

私はtop_idは私の親IDフィールドであるSQLクエリによって返されるオブジェクトのこの配列を持っている:オブジェクトの配列レコードセットから入れ子になったHTMLリストを取得するには?

Array (
[0] => stdClass Object ([id] => 1 [top_id] => 0 [name] => Cat 1) 
[1] => stdClass Object ([id] => 2 [top_id] => 0 [name] => Cat 2) 
[2] => stdClass Object ([id] => 3 [top_id] => 0 [name] => Cat 3) 
[3] => stdClass Object ([id] => 4 [top_id] => 2 [name] => Subcat 1) 
[4] => stdClass Object ([id] => 5 [top_id] => 2 [name] => Subcat 2) 
[5] => stdClass Object ([id] => 6 [top_id] => 3 [name] => Subcat 3) 
[6] => stdClass Object ([id] => 7 [top_id] => 5 [name] => Subcat 4) 
) 

は今、私はこの使用してPHPのようなネストされたリストを取得する必要があります。

<ul> 
    <li>Cat 1</li> 
    <li>Cat 2 
    <ul> 
     <li>Subcat 1</li> 
     <li>Subcat 2 
     <ul> 
      <il>Subcat 3 
      <ul> 
       <li>Subcat 4</li> 
      </ul> 
      </li> 
     </ul> 
     </li> 
    </ul> 
    </li> 
    <li>Cat 3</li> 
</ul> 

任意のアイデア? おかげですべてのインデックスがidである新しいハッシュ(アレイ)上にオブジェクトをマップの

+0

"top_id"はサブカテゴリが属するカテゴリを示しますか? – TaylorOtwell

答えて

9

まず:

// map the array onto hash 
$hash = array(); 
foreach($array as $object) 
{ 
    $hash[$object->id] = array('object' => $object); 
} 

そしてこのanswer for another code exampleを参照して、ツリー状の構造にこの平坦なハッシュを転置、

最後に、このツリー状の構造をHTMLとして出力することができます。これは、スタックまたは再帰的に行うことができます。

// render tree 
function render_tree($tree) 
{ 
    echo '<ul>', "\n"; 
    foreach($tree as $node) 
    { 
     render_node($node); 
    } 
    echo '</ul>'; 
} 

// render tree node 
function render_node($node, $level = 0) 
{ 
    $inset = str_repeat(' ', $level) . ' '; 
    echo $inset, '<li>', $node['object']->name; 
    if (isset($node['children'])) 
    { 
     echo "\n", $inset, ' <ul>', "\n"; 
     foreach($node['children'] as $node) 
     { 
      render_node($node, $level+1); 
     } 
     echo $inset, ' </ul>', "\n", $inset; 
    } 
    echo '</li>', "\n"; 
} 

// output 
render_tree($tree); 

出力:

<ul> 
    <li>Cat 1</li> 
    <li>Cat 2 
    <ul> 
     <li>Subcat 1</li> 
     <li>Subcat 2 
     <ul> 
      <li>Subcat 4</li> 
     </ul> 
     </li> 
    </ul> 
    </li> 
    <li>Cat 3 
    <ul> 
     <li>Subcat 3</li> 
    </ul> 
    </li> 
</ul> 

Full code Example + HTML Demoこれは再帰を持つ一つの変形です。

+0

ねえ男!それは素晴らしい作品です!ありがとうございます... – redbaron76

+0

@ redbaron76:どうぞよろしくお願いします。それがあなたを助けた場合、答えを受け入れることを忘れないでください:http://meta.stackexchange.com/q/5234/147909。 – hakre

+0

briliant、excelent ...ありがとう – Florin

関連する問題