0

私は画像ギャラリーに取り組んでおり、カテゴリをループする際に支援が必要です。次の深さはギャラリー構成ファイルの既知の設定であるため、これは無限の深さをループする問題ではなく、既知の深さをループしてすべての結果を出力する最も効率的な方法です。

<select>基本的に、子供、孫など、システムで定義されたすべてのカテゴリを含むボックスを作成したいと考えています。

カテゴリは、次のようにデータベースに格納されます (他にもフィールドがありますが、関連はありません)。

+----+--------+--------------+
| id | parent |     name     |
+----+--------+--------------+
|  1 |    0   | Parent 1     |
|  2 |    1   | Child Lvl  1 |
|  3 |    2   | Child Lvl 2  | 
|  4 |    0   | Parent 2     |
+----+--------+--------------+

== 0を持つカテゴリは、parentそれ自体が最上位の親と見なされます。すでに述べたように、最大​​深度は既知であり、事前に決定されているため、次のようなものを出力したいと思います。

Parent 1
  - Child Lvl 1
    - Child Lvl 2
Parent 2

ループの可能性もあると思っていwhileたのですが、なぜかPHPが無限ループに陥ってしまいます。

これまでに試したコードは次のとおりです。

$sql = $_database->prepare("SELECT `id`, `name` FROM `".TBL_PREFIX."categories` WHERE `parent` = '0' ORDER BY `name` ASC");
$sql->execute();
while($cat = $sql->fetchObject())
{
    $html.= "\n\t".'<option value="'.$cat->id.'"';
    $html.= (array_key_exists('selected_val', $options) && $options['selected_val'] == $cat->id) ? ' selected="selected"' : '';
    $html.= (array_key_exists('disabled_vals', $options) && in_array('', $options['disabled_vals'])) ? ' disabled="disabled"' : '';
    $html.= '>'.$cat->name.'</option>';

    $childSql = $_database->prepare("SELECT COUNT(*) AS `total` FROM `".TBL_PREFIX."categories` WHERE `parent` = :parent");
    $childSql->execute(array(':parent' => $cat->id));

    $numChildren = $childSql->fetchObject();
    $numChildren = $numChildren->total;
    $parentId = $cat->id;

    while($numChildren > 0)
    {
        for($i = 0; $i < (MAX_CAT_DEPTH - 1); $i++)
        {
            $children = $_database->prepare("SELECT `id`, `name` FROM `catgeories` WHERE `parent` = :parent ORDER BY `name` ASC");
            $children->execute(array(':parent' => $parentId));

            while($child = $children->fetchObject())
            {
                $html.= "\n\t".'<option value="'.$child->id.'"';
                $html.= (array_key_exists('selected_val', $options) && $options['selected_val'] == $child->id) ? ' selected="selected"' : '';
                $html.= (array_key_exists('disabled_vals', $options) && in_array('', $options['disabled_vals'])) ? ' disabled="disabled"' : '';
                $html.= '>'.$child->name.'</option>';

                $parentId = $child->id;

                $childSql = $_database->prepare("SELECT COUNT(*) AS `total` FROM `".TBL_PREFIX."categories` WHERE `parent` = :parent");
                $childSql->execute(array(':parent' => $parentId));
                $numChildren = $childSql->fetchObject();
                $numChildren = $numChildren->total;
            }
        }
    }
}

誰でもこれについて正しい方法を提案できますか。私がすでに持っているものはここでの要件に十分すぎると信じているので、DB構造をあまりいじりたくありません.これは他の質問のように無限の深さに関する質問ではありません.

4

1 に答える 1

1

再帰ステートメントを避けるために、代わりに醜い mptt アルゴリズムを試してください。Zebra MPTT は良い解決策です。Gedmo ツリーの方がいいです。

于 2013-11-07T22:25:25.243 に答える