【问题标题】:Getting infinite levels of subnavigations获得无限级别的子导航
【发布时间】:2016-05-07 20:45:31
【问题描述】:

我有一个 SQL 表,其中包含一个 ID 和一个分配给同一个表的外键。我正在使用它通过 PHP 管理网页中的(子)导航点。

(page_id 6 当然 page_fs 应该是 5,抱歉打错了)

如您所见,如果 page_fs 等于 0 则为顶层,否则为具有相同 ID 的页面的子导航。

使用 PHP 获取此类列表的最有效方法是什么:
第 1 页
--第1.1页
--1.2页
----第1.2.1页
第 2 页
--第2.1页
第 3 页

它应该支持无限数量的层。

感谢您的帮助

【问题讨论】:

  • 由于 mysql 不支持 CTE(公用表表达式),您需要执行的递归查询类型来生成基于平面表的菜单结构变得非常复杂。一些 rdbms 内置了 recursive 能力,没有这个你需要对 sql 感到棘手。阅读 CTE ~ google.co.uk/…
  • 感谢您的快速回复。我很抱歉,但我刚刚意识到我的问题没有得到很好的解释。我不需要 SQL 查询,只需要一个 PHP 函数。

标签: php mysql sql recursion


【解决方案1】:

我想最有效的方法是将positionlevel 也存储在数据库中。但是,如果不能或不想这样做,这里有一种方法可以在数组结构中表示您的导航:

<?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 输出中。

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多