在PHP中动态生成Select OptGroup选项

时间:2014-01-22 18:56:11

标签: php html cakephp option optgroup

我有一个如下数组,我想构建一个Select DropDown的嵌套选项

array(
    (int) 0 => array(
        'ProductCategory' => array(
            'id' => '5',
            'name' => 'Mud',
            'parent_id' => '0'
        ),
        'children' => array(
            (int) 0 => array(
                'ProductCategory' => array(
                    'id' => '6',
                    'name' => 'Sand',
                    'parent_id' => '5'
                ),
                'children' => array(
                    (int) 0 => array(
                        'ProductCategory' => array(
                            'id' => '7',
                            'name' => 'Soil',
                            'parent_id' => '6'
                        ),
                        'children' => array()
                    )
                )
            )
        )
    ),
    (int) 1 => array(
        'ProductCategory' => array(
            'id' => '8',
            'name' => 'House',
            'parent_id' => '0'
        ),
        'children' => array(
            (int) 0 => array(
                'ProductCategory' => array(
                    'id' => '9',
                    'name' => 'Door',
                    'parent_id' => '8'
                ),
                'children' => array(
                    (int) 0 => array(
                        'ProductCategory' => array(
                            'id' => '11',
                            'name' => 'Latch',
                            'parent_id' => '9'
                        ),
                        'children' => array()
                    ),
                    (int) 1 => array(
                        'ProductCategory' => array(
                            'id' => '12',
                            'name' => 'Glass',
                            'parent_id' => '9'
                        ),
                        'children' => array(
                            (int) 0 => array(
                                'ProductCategory' => array(
                                    'id' => '13',
                                    'name' => 'Semi ',
                                    'parent_id' => '12'
                                ),
                                'children' => array()
                            )
                        )
                    )
                )
            ),
            (int) 1 => array(
                'ProductCategory' => array(
                    'id' => '10',
                    'name' => 'Window',
                    'parent_id' => '8'
                ),
                'children' => array()
            )
        )
    )
)

我正在寻找一种循环并创建HTML代码的有效方法,如下所示。我不确定它会有多少级别。所以我需要一个证明循环。

<select>
    <optgroup label="Level One">
     <option> A.1 </option>
     <optgroup label="Level Two">
      <option> A.B.1 </option>
     </optgroup>
     <option> A.2 </option>
    </optgroup>
</select>

通过下拉列表进行嵌套查看的示例

News
--Sport
----Sky
----Football
------Football-1
--War
----War1
--tech
Article
--tech
----tech2
------tech3
--php
--linux

2 个答案:

答案 0 :(得分:1)

来自CI表格助手:

Click here

function form_dropdown($name = '', $options = array(), $selected = array(), $extra = ''){
    if ( ! is_array($selected))
    {
        $selected = array($selected);
    }

    // If no selected state was submitted we will attempt to set it automatically
    if (count($selected) === 0)
    {
        // If the form name appears in the $_POST array we have a winner!
        if (isset($_POST[$name]))
        {
            $selected = array($_POST[$name]);
        }
    }

    if ($extra != '') $extra = ' '.$extra;

    $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : '';

    $form = '<select name="'.$name.'"'.$extra.$multiple.">\n";

    foreach ($options as $key => $val)
    {
        $key = (string) $key;

        if (is_array($val) && ! empty($val))
        {
            $form .= '<optgroup label="'.$key.'">'."\n";

            foreach ($val as $optgroup_key => $optgroup_val)
            {
                $sel = (in_array($optgroup_key, $selected)) ? ' selected="selected"' : '';

                $form .= '<option value="'.$optgroup_key.'"'.$sel.'>'.(string) $optgroup_val."</option>\n";
            }

            $form .= '</optgroup>'."\n";
        }
        else
        {
            $sel = (in_array($key, $selected)) ? ' selected="selected"' : '';

            $form .= '<option value="'.$key.'"'.$sel.'>'.(string) $val."</option>\n";
        }
    }

    $form .= '</select>';

    return $form;
}

示例:

<?php
$options = Array(
    "value1" => "label1",
    "value3" => "label2",
    "value3" => "label3"
);
echo form_dropdown("my_field_name",$options,"value2","class='the_class_of_my_obj'");
?>

示例2:

<?php
$options = Array(
    Array(
        "value1.1" => "label 1.1",
        "value1.2" => "label 1.2"
    ),
    "value3" => "label2",
    "value3" => "label3"
);
echo form_dropdown("my_field_name",$options,"value2","class='the_class_of_my_obj'");
?>

答案 1 :(得分:1)

select标记中没有使用多级深度的解决方案(HTML限制)。

但您可以使用HtmlHelper::nestedList();

在不optgroup的情况下构建简单的下拉列表