 <?php
/**
 * @name: set_attribute
 * Create attributes for DOM element from array. The html5 data-attributes and native attributes are hadnled separately
 * @param $attributes
 * @param null $data_attributes
 * @return string
 */
    function set_attributes($attributes, $data_attributes = null){
        $html = ' ';
        foreach($attributes as $k => $v){
            if(!is_array($v)){
                $html.=$k.'="'.$v.'" ';
            }
        }
        if($data_attributes && $data_attributes !== null && is_array($data_attributes)){
            foreach($data_attributes as $k => $v){
                if(!is_array($v)){
                    $html.='data-'.$k.'="'.$v.'" ';
                }
            }
        }
        return $html;
    };
/**
 * @name build_selector
 * Creates a html select element with options, optgroups. It marks the selected element or if
 * selected element is not presented, the first element.
 * @param array $options Source for options and optgroups
 * Format:
 * <b>options:</b>
 *  - value => option
 * <b>groups:</b>
 *  - group => array( 'groupname', array( //options )
 * @param null $attributes Source for attributes
 * @param null $selected Value of the selected option
 * @throws Exception
 */
    function build_selector($options = array(),$attributes = null,$selected = null){

        $options = (!empty($options) && is_array($options)) ? $options : false;
        $selected = ($selected !== null && !empty($selected) && !is_array($selected)) ? $selected : false;
        $attributes = (!empty($attributes) && is_array($attributes)) ? $attributes : false;
        $data_attributes = (array_key_exists('data-',$attributes) && (!empty($attributes['data-']))) ? $attributes['data-'] : false;

        $html_wrapper = '<select';
        $html_inside = '';
        if(!$options){ throw new Exception('options argument must be an array!'); exit(1);}

        function create_options($options,$selected, $i = null){
            $i = ($i !== null) ? $i : 0;
            foreach($options as $k => $v){
                $hasChild = ( $k !== null && strtolower($k) == 'group' && is_array($v)) ? true : false;
                if(!$hasChild){
                    if($v && !empty($v))
                        echo '<option value="'.$k.'"'.(($selected && $selected == $k)||(!$selected && $i == 0)).'>'.$v.'</option>';
                    else
                        echo '<option value="'.$k.'"'.(($selected && $selected == $k)||(!$selected && $i == 0)).'>'.$k.'</option>';
                    $i++;
                }else{
                    echo '<optgroup label="'.$v[0].'">';
                    call_user_func('create_options',$v[1], $i);
                    echo '</optgroup>';
                }
            }
        };

        try{
            var_dump($data_attributes);
            $attributes_html = set_attributes($attributes,$data_attributes);
            echo '<select'.$attributes_html.'>';
            create_options($options,$selected);
            echo '</select>';
        } catch (Exception $e){
            echo "build_selector error: ".$e->getMessage();
            die(1);
        }



    };
?> 