/** * 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(' > ', array_keys($niveis)).' > '.$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(' > ', array_keys($niveis)).' > '.$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; }