簡體   English   中英

PHP遞歸導航

[英]PHP Recursive navigation

所以我有關於遞歸數組的問題。 我想要的是從數據庫中獲取一個PHP遞歸數組,這樣我就可以創建帶有子菜單的導航菜單,而無需創建另一個表。

這是我到目前為止的功能;

function getMenu($tree = null){
        $tree2 = array();
        $tree = getPages();
        foreach($tree as $i => $item){
            if($item->parent_id == $item->ID){
                $tree2[$item->ID] = $item;
                $tree2[$item->ID]['submenu'] = getMenu($tree, $item->ID);
            }
        }

        return $tree2;
    }

為了清楚起見,我不是自己創建此功能的,而是從http://www.jugbit.com/php/php-recursive-menu-with-1-query/獲得的,並在我認為合適的地方進行了調整

$ tree變量來自此函數;

function getPages($limit = null,$sort = null) {
     global $db;
     $query = $db->prepare('SELECT * FROM pages ORDER BY Position');
     $query->execute();
     return $query->fetchAll(PDO::FETCH_CLASS);
}

現在,過去兩天來,我一直在努力解決問題,以弄清我做錯了什么。

如果我打印getMenu函數,我得到的只是一個空數組,但我不知道為什么。 它確實得到了正確的foreach,我不認為這是問題,但我不確定100%。

我希望這個問題很清楚,但如果不是這樣,我很抱歉,並將在需要的地方澄清。

提前致謝

getPages ,如果希望它返回一個關聯數組,則需要執行以下操作:

return $query->fetchAll(PDO::FETCH_ASSOC);

然后您的getMenu看起來像:

function getMenu($tree = null, $parent = 0) {
    if (!isset($tree))
        $tree = getPages();

    $tree2 = array();
    foreach($tree as $i => $item) {
        if($item['id'] == $parent) {
            $tree2[$item['id']] = $item;
            $tree2[$item['id']]['submenu'] = getMenu($tree, $item['id']);
        }
    }

    return $tree2;
}

您的代碼有很多問題...

首先,您可以通過3種不同的方式使用名為$tree的變量,而且我很確定您會覆蓋該變量的內容而沒有任何意義。

$ tree是函數的參數,然后在$tree = getPages();行中覆蓋它$tree = getPages(); -因此,傳入的任何參數都消失了。 然后,將其用作foreach($tree as $i => $item)行中的迭代器-因此,這里的內容再次被覆蓋。

查看如果解決此問題會發生什么。

其次,您的SQL語句檢索整個“頁面”表,而不是當前頁面的子代。

第三,當您遞歸時,您傳入了第二個參數,但是在函數聲明中沒有該占位符,因此該參數逐漸消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM