Man bør nøjes med et SQL kald når det kommer til hierarkisk menu strukturer. Ville nok også holde mig fra INNER JOIN. Først hvis menuen strukturen bliver rigtig stor er det værd at tage et kig på Nested Set Modellen
http://en.wikipedia.org/wiki/Nested_set_modelMen kastede lige noget sammen fra et tidligere projekt:
- <?php
- // SQL result
- $menuitems = array(
- array('id' => 1, 'parent_id' => 0, 'title' => 'Menu 1'),
- array('id' => 2, 'parent_id' => 0, 'title' => 'Menu 2'),
- array('id' => 3, 'parent_id' => 1, 'title' => 'Menu 3 (Parent 1)'),
- array('id' => 4, 'parent_id' => 6, 'title' => 'Menu 4 (parent 6)'),
- array('id' => 5, 'parent_id' => 3, 'title' => 'Menu 5 (Parent 3)'),
- array('id' => 6, 'parent_id' => 3, 'title' => 'Menu 6 (Parent 3)')
- );
-
- // PHP sorting
- $tmp = array(0 => array('title' => 'root', 'children'=>array()));
- foreach($menuitems as $item) {
- $tmp[$item['id']] = isset($tmp[$item['id']]) ? array_merge($tmp[$item['id']],$item) : $item;
- $tmp[$item['parent_id']]['children'][] =& $tmp[$item['id']];
- }
-
- // Make me a root
- $root = array($tmp[0]);
-
- // Recursive traversal
- function traverse($array){
- $str = '<ul>';
- foreach($array as $item) {
- $str .= '<li>'.$item['title'].($item['children']?traverse($item['children']):'').'</li>';
- }
- $str .= '</ul>';
- return $str;
- }
-
- // Output something
- echo traverse($root);
Indlæg senest redigeret d. 10.09.2011 00:21 af Bruger #10216