【问题标题】:Generating A Select With Multiple Nesting生成具有多个嵌套的选择
【发布时间】:2014-11-12 21:13:07
【问题描述】:

我有多个嵌套的产品类别,我需要在我的管理系统中的选择框中选择这些。我正在使用以下函数生成一个多维数组,然后可以将其传递给 codeigniter 的form_dropdown function。这将接受一个数组中的一个数组,但不接受另一个数组。如果数组顶层中的项是数组,它将生成一个 optgroup 元素而不是一个 select 选项。查看此代码以获得进一步的解释:

$categories = array(
    0 => "top level 1",                 //Generates an <option> element correctly
    "sub level name" => array (         //Generates an <optgroup> element correctly
        2 => "sub level 1",
        "sub sub level name" = array(   //Generates <option value="sub sub level name">Array</option>
            3 => "sub sub level 1"
        )
    )
);

为了避免子子关卡生成不正确的选项元素,我需要它生成一个在它之前有 4 个 &nbsp 的子关卡,如下所示:

     $categories = array(
        0 => "top level 1",                 //Generates an <option> element correctly
        "sub level name" => array (         //Generates an <optgroup> element correctly
            2 => "sub level 1"
        ),
       "&nbsp;&nbsp;&nbsp;&nbsp;sub sub level name" = array(    //Generates an <optgroup> element correctly
                3 => "sub sub level 1"      //Generates an <option> element correctly
            )
    );

我不知道该怎么做。我认为我的代码已经完成了 95%,因为它将生成第一个代码 sn-p,但我无法获得第二个代码 sn-p。这是我的功能:

function createCategoryOptions($categories, $spacing = "", $top = true)
{
    print_r($categories);
    $options = array();
    foreach ($categories as $key=>&$category) 
    {
        if (array_key_exists('children', $category))
        {
            usort($category['children'], function($a, $b) {
                return count($b) - count($a);
            } );
            if($top)
            {
                $options[$spacing.$category['product_category_title']] = createCategoryOptions($category['children'], $spacing."&nbsp;&nbsp;&nbsp;&nbsp;", false);
            }
            else
            {
                //This is what generates sub sub levels incorrectly
                $options[$spacing.$category['product_category_title']] = createCategoryOptions($category['children'], $spacing."&nbsp;&nbsp;&nbsp;&nbsp;", false);
            }
        }
        else
        {
            $options[$key] = $spacing.$category['product_category_title'];
        }
    }

    return $options;
}

这里是一些输入到函数中的示例数据:

array
(
    //Top Level
    [14] => array
        (
            [product_category_id] => 14
            [product_category_parent_id] => 
            [product_category_title] => Daily Living
            [children] => array
                (
                    //Sub Level
                    [58] => array
                        (
                            [product_category_id] => 58
                            [product_category_parent_id] => 14
                            [product_category_title] => Daily Living : AJ Way
                            [children] => array
                                (
                                    //Sub Sub level
                                    [68] => array
                                        (
                                            [product_category_id] => 68
                                            [product_category_parent_id] => 58
                                            [product_category_title] => Daily Living : AJ Way : Coverdry
                                        )

                                )

                        )

                )

        )

)

有什么想法吗?

【问题讨论】:

    标签: php arrays codeigniter recursion


    【解决方案1】:

    您可能想使用optgroup 标签:

    <select>
        <optgroup label="Swedish Cars">
            <option value="volvo">Volvo</option>
            <option value="saab">Saab</option>
        </optgroup>
        <optgroup label="German Cars">
            <option value="mercedes">Mercedes</option>
            <option value="audi">Audi</option>
        </optgroup>
    </select>
    

    另外,你需要在那里重复一次。

    【讨论】:

    • 我正在尝试使用 optgroups,请参阅前 2 个代码 sn-ps 中的 cmets
    • 你需要一个函数 generateOptions($array){} 来插入选项,当它到达 'children' 时调用 generateOptions($array['children']) ...
    • 这不是第三个sn-p中的函数做的还是不同的?
    猜你喜欢
    • 2021-01-21
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多