/**
 * Monta um select hierarquico
 * @param array $vetor Vetor hierarquico
 * @param string $tipo Tipo de simbolos usados para montar a estrutura (light, simple ou double)
 * @return string Campo select
 */
function montar_select($vetor, $tipo = 'light') {

/*
Caracteres:
║ ║
╠ ╠
╚ ╚

│ │
├ ├
└ └
*/

    // Obter conjunto de caracteres desejados
    $caracteres = new stdClass();
    switch ($tipo) {
    case 'simple':
        $caracteres->espaco             = '   ';
        $caracteres->topo_baixo         = '|  ';
        $caracteres->topo_direita_baixo = '|- ';
        $caracteres->topo_direita       = '\'- ';
        break;
    case 'double':
        $caracteres->espaco             = '  ';
        $caracteres->topo_baixo         = '║ ';
        $caracteres->topo_direita_baixo = '╠ ';
        $caracteres->topo_direita       = '╚ ';
        break;
    case 'light':
        $caracteres->espaco             = '  ';
        $caracteres->topo_baixo         = '│ ';
        $caracteres->topo_direita_baixo = '├ ';
        $caracteres->topo_direita       = '└ ';
        break;
    default:
        trigger_error('Tipo de option invalido: '.$tipo, E_USER_WARNING);
        return false;
    }

    // Montar o select
    $select = '<select style="font-family: Monospace;">'.
              montar_options($vetor, $caracteres).
              '</select>';
    return $select;
}


/**
 * Retorna as opcoes do select de forma recursiva
 * @param array $vetor Vetor hierarquico
 * @param stdClass $caracteres Pacote de caracteres a serem usados
 * @param array $niveis Vetor auxiliar para montar os niveis hierarquicos
 * @return string
 */
function montar_options($vetor, $caracteres, $niveis = array()) {
    $chaves = array_keys($vetor);
    $ultima_chave = array_pop($chaves);
    unset($chaves);

    $options = '';
    foreach ($vetor as $chave => $valor) {
        $ultimo = $ultima_chave === $chave;

        // Descer um nivel
        if (is_array($valor)) {
            $options .= '<option title="'.implode(' &gt; ', array_keys($niveis)).' &gt; '.$chave.'">';


            foreach ($niveis as $nivel) {
                $options .= $nivel ? $caracteres->espaco : $caracteres->topo_baixo;
            }
            $options .= $ultimo ? $caracteres->topo_direita : $caracteres->topo_direita_baixo;
            $options .= strval($chave);
            $options .= '</option>';

            $niveis_novo = $niveis;
            $niveis_novo[$chave] = $ultimo;
            $options .= montar_options($valor, $caracteres, $niveis_novo);

        // Montar o nivel corrente
        } else {
            $options .= '<option value="'.strval($chave).'" title="'.implode(' &gt; ', array_keys($niveis)).' &gt; '.$valor.'">';
            foreach ($niveis as $nivel) {
                $options .= $nivel ? $caracteres->espaco : $caracteres->topo_baixo;
            }
            $options .= $ultimo ? $caracteres->topo_direita : $caracteres->topo_direita_baixo;
            $options .= strval($valor);
            $options .= '</option>';
        }
    }
    return $options;
}