1

親子カテゴリリストの作成方法を学んでいます。すばらしいチュートリアルを見つけて、次のコードを実装しました。

while($row = $tree_sth->fetch()){
    $rows[$row['id']] = array('name'=>$row['name'], 'on'=>$row['on'], 'parent'=>$row['parent']);
}

function btree($parent){

    $has_childs = false;
    global $rows;

    foreach ($rows as $key => $value){
        if($value['parent'] == $parent){
            if ($has_childs === false){
                $has_childs = true;
                echo '<ul>';
            }
            echo '<li>'.$value['name'];
            btree($key);
            echo '</li>';
        }
    }
    if($has_childs === true){
        echo'</ul>';
    }
}

私が理解するのに苦労しているのは、foreach関数と再帰関数がPHPによってどのように処理されるかです。

これにより、複数の「インスタンス」が発生するようです。関数とforeachループを同時に実行する方法...それは正しいですか?

これが起こっているのであれば、私のリストが大きくなり、子の関係が深くなるにつれて、これは遅くなる可能性があります。これは本当ですか?

4

1 に答える 1

2

短い、短いバージョンは、関数が次のように機能していることです。

Begin-function (first instance):
     Begin-loop:
          Loop...
          Begin-func-again?

               Begin-function (second instance):
                   Begin-loop:
                        Loop... 
                        Begin-func-again?

                             Begin-function (third instance):
                                  Begin-loop:
                                      Loop...
                                      Begin-func-again? (NO)
                                          // termination point reached
                                  End-loop
                             End-function (third instance)

                    End-loop (from second instance)
               End-function (second instance)

     End-loop (from first instance)
End-function(first instance)

同時に作成される関数の複数のバージョンがあるわけではありません。それらは順番に実行される拡張と縮小ですが、それらはすべて元の関数呼び出しに由来します。

于 2013-03-10T00:03:02.997 に答える