0

私はデータベースを介してカテゴリマネージャーを構築しています。次のPHPは、その下に貼り付けるコードを生成します。

function generate_menu($parent, $menu_array, $result = NULL)
{
    $has_childs = FALSE;

    foreach($menu_array as $key => $value):
        if ($value['parent'] == $parent):
            $result .= '<li id="list_'.$value['id'].'" class="item">';
            $result .= '<div class="item">' . $value['name'] . '</div>';

            if ($has_childs):
                $has_childs = FALSE;
                $result .= '<ol>';
            else:
                $has_childs = TRUE;
                $result .= '</li>';
            endif; 

            $result .= $this->generate_menu($key, $menu_array);
        endif;
    endforeach;

    return $result;
}

そして、これが生成するHTMLです。

<li id="list_11" class="item">
    <div class="item">Real Estate</div>
</li>
<li id="list_12" class="item">
    <div class="item">Home Improvements</div>
    <ol>
        <li id="list_13" class="item">
            <div class="item">Interior</div>
        </li>
        <li id="list_14" class="item">
            <div class="item">Exterior</div>
            <ol>
                <li id="list_15" class="item">
                    <div class="item">Exterior Subcat</div>
                </li>

そのため、親の場合はタグを閉じることができ<li>ますが、親のあるアイテムの場合<ol>は、方程式を入力します。その時、どうやって閉じるのかわからない。</li>とをどこに置くかわかりません</ol>。私が試したすべてがうまくいきません。

外観は次のとおりです

<li id="list_11" class="item">
    <div class="item">Real Estate</div>
</li>
<li id="list_12" class="item">
    <div class="item">Home Improvements</div>
    <ol>
        <li id="list_13" class="item">
            <div class="item">Interior</div>
        </li>
        <li id="list_14" class="item">
            <div class="item">Exterior</div>
            <ol>
                <li id="list_15" class="item">
                    <div class="item">Exterior Subcat</div>
                </li>
            </ol>
        </li>
    </ol>
</li>

編集:

配列を渡してメニューを生成するためのコードは次のとおりです。

$query = $this->db->get('categories');

foreach($query->result_array() as $row):
    $menu_array[$row['id']] = array('name' => $row['name'], 'parent' => $row['parent'], 'id' => $row['id']);
endforeach;

echo '<ol class="sortable">';
echo $this->tasks->generate_menu(0, $menu_array);
echo '</ol>';

そして、これが$menu_arrayのprint_rです。

Array
(
    [11] => Array
        (
            [name] => Real Estate
            [parent] => 
            [id] => 11
        )

    [12] => Array
        (
            [name] => Home Improvements
            [parent] => 
            [id] => 12
        )

    [13] => Array
        (
            [name] => Interior
            [parent] => 12
            [id] => 13
        )

    [14] => Array
        (
            [name] => Exterior
            [parent] => 12
            [id] => 14
        )

    [15] => Array
        (
            [name] => Exterior Subcat
            [parent] => 
            [id] => 15
        )

)
4

2 に答える 2

0

私はこれを理解しました。私は物事を少し複雑にしていました。

function generate_menu($parent, $menu_array, $result = NULL)
{       
    foreach($menu_array as $key => $value):
        if ($value['parent'] == $parent):
            $result .= '<li id="list_'.$value['id'].'" class="item">';
            $result .= '<div class="item">' . $value['name'] . '</div>';
            $result .= '<ol>';
            $result .= $this->generate_menu($key, $menu_array);
            $result .= '</li></ol>';
        endif;
    endforeach;

    return $result;
}
于 2012-04-04T22:49:22.997 に答える
0

再帰関数を適切に使用するには、値の配列が次のように階層を反映する必要があります。

array(
[11] => "Real Estate",
[12] => array(
    [0] => "Home Improvements",
    [13] => "Interior",
    [14] => "Exterior"
    ),
[15] => "Exterior Subcat"
)

これで、関数は11を反復処理して、通常どおりリスト項目を追加できます。12では、文字列ではなく配列に遭遇するgettype($value)ため(use)、リストアイテムを追加する代わりに、再度呼び出します。見つかった配列を引数として渡します。これにより、理論的には無制限のレベル数が可能になります。

function make_menu($menu_array) {

    $result = "<ol>";

    foreach($menu_array as $k=>$v)
    {
        $result .= '<li id="list_'.$k.'" class="item">';

        if(gettype($v) == 'array')
        {
            $result .= '<div class="item">' . $v[0] . '</div>';
            unset($v[0]);
            $result .= make_menu($v);
        }
        elseif(gettype($v) == 'string')
        {
            $result .= '<div class="item">' . $v . '</div>';
        }

        $result .= '</li>';
    }
    $result .= "</ol>";
    return $result;
}
于 2012-04-04T23:10:24.680 に答える