0

私はこのような配列($ネストされた)を持っています(これはprint_r()出力です)

Array
(
    [1] => Array
        (
            [id] => 1
            [module] => 1
            [parent] => 0
            [name] => Audio
        )

    [20] => Array
        (
            [id] => 20
            [module] => 1
            [parent] => 5
            [name] => Mixer analogici
        )

    [16] => Array
        (
            [id] => 16
            [module] => 1
            [parent] => 4
            [name] => Videoproiettori
        )

    [11] => Array
        (
            [id] => 11
            [module] => 1
            [parent] => 2
            [name] => Strutture
        )

    ...

    [19] => Array
        (
            [id] => 19
            [module] => 1
            [parent] => 5
            [name] => Mixer digitali
        )

)

ネストされたメニューを作成するための再帰関数:

function nmenu($module, $parent, $array) {
    $has_children = false;
    foreach($array as $key => $value) {
        if ($value['module'] == $module) {  
            if ($value['parent'] == $parent) {       
                if ($has_children === false && $parent) {
                    $has_children = true;
                    echo "<ul>\n";
                }
                echo '<li>';
                echo '' . $value['name'] . " \n";
                    nmenu($module, $key, $array);
                echo "</li>\n";
            }
        }
    }
    if ($has_children === true && $parent) echo "</ul>\n";
}

私がこのように呼ぶこと:

<ul>
    <?php nmenu($row_rsNavModules['mod_id'], 0, $nested) ?>
</ul>

すべて問題ありません。再帰関数は期待どおりに機能し、一連の無限にネストされた UL を作成します...まあ、それが多すぎるのは「無限」です。インデント レベル (別名、インデントされた ULS の数) を制限したいと思います) を 2 に、次のようにします。

Cat 1
    Subcat 1-1
    Subcat 1-2
    ...
Cat 2
    Subcat 2-1
    Subcat 2-2
    ...

そして、このように終わることはありません:

Cat 1
    Subcat 1-1
            Sub-Subcat 1-1-1
                    Sub-Sub-Subcat 1-1-1-1
                    ...

これを達成するために以前の関数を編集するにはどうすればよいですか? 前もって感謝します!

4

1 に答える 1

1

カウンターを用意して、カウンターが制限に達したら関数を終了するだけです。何かのようなもの:

//counter parameter added
function nmenu($module, $parent, $array, $counter) {
    $has_children = false;
    foreach($array as $key => $value) {
        if ($value['module'] == $module) {  
            if ($value['parent'] == $parent) {       
                if ($has_children === false && $parent) {
                    $has_children = true;
                    echo "<ul>\n";
                }
                echo '<li>';
                echo '' . $value['name'] . " \n";

                if($counter<2){  //added 
                    //counter parameter added
                    nmenu($module, $key, $array, $counter+1);
                } //added
                echo "</li>\n";
            }
        }
    }
    if ($has_children === true && $parent) echo "</ul>\n";
}

そして、次のように呼び出します。

<ul>
    <?php 
       //counter parameter added 
       nmenu($row_rsNavModules['mod_id'], 0, $nested, 1) 
    ?>
</ul>
于 2012-12-12T09:59:11.830 に答える