生成具有多个嵌套的选择


Generating A Select With Multiple Nesting

我有多个嵌套的产品类别,我需要在管理系统的选择框中进行选择。我使用以下函数生成一个多维数组,然后将其传递给codeigniter的form_dropdown函数。这将接受一个数组中的一个数组,但不接受数组中的另一个数组。如果数组顶层中的项是一个数组,它将生成一个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%,因为它将生成第一个代码片段,但我无法获得第二个代码片段。这是我的功能:

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
                                        )
                                )
                        )
                )
        )
)

有什么想法吗?

您可能想要使用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>

此外,你需要在那里复发。