2011-11-05 6 views
5

Ho questo array di oggetti restituiti da una query SQL in cui top_id è il mio genitore campo ID:Come ottenere un elenco HTML nidificato dal recordset di array dell'oggetto?

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) 
) 

Ora ho bisogno di ottenere un elenco nidificato in questo modo utilizzando 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> 

Qualsiasi idea ? Grazie

+0

"top_id" indica a quale categoria appartiene una sottocategoria? – TaylorOtwell

risposta

9

Innanzitutto mappare gli oggetti su un nuovo hash (array) in cui l'indice è il id:

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

Poi attuare la presente hash piatto in una struttura ad albero, questa answer for another code example, è semplicemente la stessa qui:

// build tree from hash 
$tree = array(); 
foreach($hash as $id => &$node) 
{ 
    if ($parent = $node['object']->top_id) 
     $hash[$parent]['children'][] =& $node; 
    else 
     $tree[] =& $node; 
} 
unset($node, $hash); 

Infine è possibile stampare questa struttura ad albero come HTML. Questo può essere fatto con uno stack o ricorsivo. Questa è una variante con ricorsione:

// 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); 

uscita:

<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

Ehi amico! Funziona benissimo !! Grazie mille ... – redbaron76

+0

@ redbaron76: prego. Non dimenticare di accettare la risposta se ti ha aiutato: http://meta.stackexchange.com/q/5234/147909. – hakre

+0

brillante, eccellente ... grazie – Florin

Problemi correlati