0

したがって、再帰配列に関してこの問題があります。私が欲しいのは、データベースから 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);
}

今、私は過去2日間、私が間違っていることを理解しようとして、これについてボールをつぶしてきました.

getMenu 関数を出力すると、空の配列しか取得できず、理由がわかりません。それはforeachを正しく取得し、それが問題だとは思いませんが、100%確信が持てません..

質問が明確であることを願っていますが、そうでない場合は申し訳ありませんが、必要な場所を明確にします。

前もって感謝します

4

2 に答える 2

3

で連想配列を返す場合は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;
}
于 2013-01-16T21:17:43.320 に答える
1

あなたのコードにはたくさんの問題があります...

まず、$tree3 つの異なる方法で名前が付けられた変数を使用していますが、その変数の内容を意味なく上書きしていると確信しています。

$tree は関数のパラメーターであり、その行で上書きされる$tree = getPages();ため、渡されたパラメーターはすべて失われます。次に、それを行の反復子として使用します。つまりforeach($tree as $i => $item)、そこにあったものはすべて上書きされます。

それを修正するとどうなるか見てみましょう。

次に、SQL ステートメントは、現在のページの子ではなく、「ページ」テーブル全体を取得します。

第 3 に、再帰を行う場合、2 番目のパラメーターを渡しますが、関数宣言にそのプレースホルダーがないため、パラメーターは空中に消えます。

于 2013-01-16T22:05:20.167 に答える