1

隣接ツリー モデル (id、parent_id) の MySQL データベースから PHP の目次を数値化/作成または生成しようとしています。これまでのところ、出力をエコーするときにこれが達成されました。

1. Category 1
   1 Subcategory 1
   2 Subcategory 2
   3 Subcategory 3
2.  Category 2
   1. Subcategory 1
      1. Subcategory Subcategory 1
      2. Subcategory Subcategory 2
   2 Subcategory 2
      1 Subcategory 1
      2 Subcategory 2

私は非常に近いですが、私が望む出力は次のとおりです。

1. Category 1
    1.1 Subcategory 1
    1.2 Subcategory 2
    1.3 Subcategory 3
2.  Category 2
   2.1. Subcategory 1
      2.1.1. Subcategory Subcategory 1
      2.1.2. Subcategory Subcategory 2
   2.2 Subcategory 2
      2.2.1 Subcategory 1
      2.2.2 Subcategory 2

つまり、Chapter.Subchapter.Subchapter.Subchapter TITLE のように、目次形式を多階層構造で使用したいと考えています。

現在のインデックスを保持し、前のインデックスに連結する再帰配列を使用してみましたが、各項目の前に奇妙な長い番号を追加することになります。

0.11。2 ..11.2.3.4.5.6. 7 ..11..11.2.3.4.5. 6台のコンピューター、

代わりに、次のようにする必要があります。

2.7.6 コンピュータ。

(その他の数字はその他の項目の数字です)

これは私が取り組んできたコードです

renumber(0,0,1,0);

function renumber($parent_id,$level=0,$counter=1) {

    // Counter level keeps track of the current index number
    $counterlevel[$level]=$counter;

    $query = "SELECT defaultTitle, id, pid FROM defaultChapters  WHERE  pid=".$parent_id;

    $res = mysql_query($query) or die(mysql_error());

    // Exit if there are no tree leafs
    if(mysql_num_rows($res) == 0) {return;}

        while (list ($title, $id) = mysql_fetch_row($res))
    {   

        $leveltext[$level][$counterlevel[$level]] = $section.".".$counterlevel[$level];


        echo str_repeat("......",$level)." ".$counterlevel[$level]." ".$section." ".$title."<BR>";
        // Increase the counter of the current level    
        $counterlevel[$level]++;


        // Initialize the level counter                     
        if(!$counterlevel[$level+1]) {

        $counterlevel[$level+1] = 1;
         }

        // Start the function again to find children
        renumber($id,$level+1,$counterlevel[$level+1]);

    } // End While



}

これを含むすべてのテクニカル サポート フォーラムを参照しましたが、これに対するアルゴリズムを公開した人は誰もいないようです。単純に、このアルゴリズムのサンプル コードがどこにもありません。番号を付けずにmysqlデータベースからphpの階層ツリーを取得するためのチュートリアルとコードは何百もありますが、phpで階層的な目次を数えることについては何もありません。

SQLクエリでもそれを行うことは可能ですか?

4

1 に答える 1

0

少しリファクタリングして、現在の呼び出しまでの番号付けを渡します。

function renumber($parent_id = 0, $level = 0, $prefix = '')
{
    // we don't need pid in the results
    $query = "SELECT defaultTitle, id
        FROM defaultChapters 
        WHERE pid=$parent_id";

    $res = mysql_query($query) or die(mysql_error());

    // Exit if there are no tree leafs
    if (mysql_num_rows($res) == 0) {
        return;
    }

    // start numbering at 1
    $nr = 1;
    while (list($title, $id) = mysql_fetch_row($res)) {
        // dropped section, not sure where it was used
        echo str_repeat("......", $level) . " $prefix.$nr $title<BR>";

        // Start the function again to find children
        renumber($id, $level + 1, strlen($prefix) ? "$prefix.$nr." : "$nr.");
        // advance list numbering
        ++$nr;
    }
}

renumber();
于 2012-10-01T04:01:44.067 に答える