我想最有效的方法是将position 和level 也存储在数据库中。但是,如果不能或不想这样做,这里有一种方法可以在数组结构中表示您的导航:
<?php
/* SQL:
SELECT * FROM `navigation` ORDER BY `page_fs` DESC, `page_id
result in: */
$sql_result = [
['page_id' => 6, 'page_fs' => 5, 'title' => 'Page 2.1' ],
['page_id' => 4, 'page_fs' => 3, 'title' => 'Page 1.2.1' ],
['page_id' => 2, 'page_fs' => 1, 'title' => 'Page 1.1' ],
['page_id' => 3, 'page_fs' => 1, 'title' => 'Page 1.2' ],
['page_id' => 1, 'page_fs' => 0, 'title' => 'Page 1' ],
['page_id' => 5, 'page_fs' => 0, 'title' => 'Page 2' ],
['page_id' => 7, 'page_fs' => 0, 'title' => 'Page 3' ]
];
function buildNavigation( $pages ) {
$navigation = [];
/* this loop assign each page to its id as an index
* Initializing ['children'] is optional. You'll' either
* have for every element or only for those which
* actually have children .*/
foreach($pages as $key => $page) {
$navigation[ $page['page_id'] ] = $page;
$navigation[ $page['page_id'] ]['children'] = [];
}
/* Bring every element as a child to its parent and unset its
* top level representation. */
foreach($pages as $key => $page) {
if( $page['page_fs'] > 0 ) {
$navigation[ $page['page_fs'] ][ 'children' ][] = $navigation[$page['page_id']];
unset($navigation[$page['page_id']]);
}
}
return $navigation;
}
echo "<pre>";
print_r( buildNavigation($sql_result) );
echo "<pre>";
?>
使用该结构,一个简单的递归函数可以将该结构传输到所需的 html 输出中。