0

「n 番目」のサブカテゴリのツリー メニューを作成する必要があります。テーブル構造に隣接リスト モデルを使用することにしました。これは、このテーブルをあまり更新しないため、これが私の用途では最も簡単に実装できるように思えたからです。

「ul」および「li」タグを使用して出力のスタイルを設定したい...スタイリングを行うための css および jquery ソリューションが既にあります。私の問題は、データベースからデータを引き出し、PHP を介して再帰関数を使用してリストを作成することにあります。リストは、ツリーを作成するために解析される連結文字列です。「ul」タグと「li」タグを必要な場所に配置するのに本当に苦労しています。

これはこれを行うための最良の方法ですか?これを行うために配列などを使用する他のより良い方法はありますか? このようなリストを作成するための「ベスト プラクティス」の例を教えていただければ幸いです。ありがとう。

これが私のテーブル構造です:

ポートフォリオ ID (int)、p_name (varchar)、parent_portfolio_id (int) 提示されたときにデータがどのように見えるかを次に示します。

<ul>
<li>Portfolio Name
    <ul>
        <li>Sub portfolio A
            <ul>
                <li>Sub portfolio A - 1</li>
                <li>Sub portfolio A - 2</li>
                <li>Sub portfolio A - 3</li>
            </ul>
        </li>
        <li>Sub portfolio B</li>
        <li>Sub portfolio C</li>
    </ul>
</li>
</ul>

現在の再帰関数は次のとおりです。

function portf($ndb, $portfolio_id, $space=1, $x="", $level=1) // cat id, space to add "_" degree of categoreis times, list of categories
{
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;";
    $select = $ndb->get_results($sql, 0, ARRAY_A);
    if( !is_null($select) )
    {
        foreach($select as $data)
        {
            $x = $x . $data->portfolio_id . '_' . $data->parent_portfolio_id . '_' . $level . str_repeat('_', $space) . $data->p_name . '-'; 
            $x = $this->portf($ndb, $data->portfolio_id, ($space+1), $x, ($level+1) );  
        }
        return $x; 
    }
    else
    {
        return $x;
    }
}
4

1 に答える 1

1

私は認めなければなりません、あなたはあなたのコードのいくつかで私を失いました。すべての $spaces と str_repeat はどうしたのですか?

とにかく、これは私が試してみたいものです。

function portf($ndb, $portfolio_id, $level=1)
{
    $sql = "SELECT portfolio_id, p_name, parent_portfolio_id FROM portfolio WHERE parent_portfolio_id = $portfolio_id ORDER BY p_name ASC;";
    $select = $ndb->get_results($sql, 0, ARRAY_A);

    if( !is_null($select) )
    {
        $li = "";
        foreach($select as $data)
        {
            $sublist = portf($ndb, $data->portfolio_id, $level+1);
            $li .= "<li>{$data->p_name}{$sublist}</li>";
        }
        $ul = "<ul class=\"level_$level\">$li</ul>";
        return $ul;
    }
    else
    {
        return "";
    }
}
于 2010-03-25T04:25:23.477 に答える