Como ordenar um vetor com valores UTF-8?
Para ordenar um vetor com valores UTF-8, é necessário aplicar o collation adequado. O collation define como dois valores são comparados de acordo com uma localidade. Abaixo é mostrado um código que realiza a ordenação levando em conta a localidade do Brasil (considere que o arquivo foi salvo com a codificação UTF-8):
Compare o resultado trocando "usort($vetor, 'strcoll');" por "sort($vetor);"
// Vetor de exemplo $vetor = array( 'êfg', 'abc', 'efg', 'bcd', 'ábc' ); // Definir a localidade (descomentar a linha adequada ao sistema) // Definindo a localidade no Linux setlocale(LC_ALL, 'pt_BR.UTF-8'); // Definindo a localidade no Windows //setlocale(LC_ALL, 'Portuguese_Brazil.1252'); // Aplicar a ordenacao usando a funcao strcoll usort($vetor, 'strcoll'); // Voltando para a localidade padrao setlocale(LC_ALL, 'C'); // Mostrando o vetor ordenado var_dump($vetor); /* Resultado: array(5) { [0]=> string(3) "abc" [1]=> string(4) "ábc" [2]=> string(3) "bcd" [3]=> string(3) "efg" [4]=> string(4) "êfg" } */
Compare o resultado trocando "usort($vetor, 'strcoll');" por "sort($vetor);"
comentários (0)
suspender
Lista de Respostas:
02/03/2010 5:18pm
(~14 anos atrás)
(~14 anos atrás)
Só uma pequena correção.
A lista não tem valores UTF-8. ã ou á não tem a ver diretamente com o collation. Sua representação hexadecimal é que é diferente em cada character set.
O que está demonstrado aqui é como ordenar baseado na configuração de cada local. No 'Local' en_US caracteres acentuados estão sempre ao final da lista enquanto no "Local" 'pt_BR' eles estão próximos.
Em hexadecimal, a ordem se mantém o que muda é apenas para o contexto da localidade. Tanto que não é preciso usar LC_ALL em setlocale, apenas LC_COLLATE.
Obs.: Para ajustar a localidade tanto em Windows quanto em Linux em PHP 5+ use
setlocale(TIPO, 'pt_BR','ptb');
A lista não tem valores UTF-8. ã ou á não tem a ver diretamente com o collation. Sua representação hexadecimal é que é diferente em cada character set.
O que está demonstrado aqui é como ordenar baseado na configuração de cada local. No 'Local' en_US caracteres acentuados estão sempre ao final da lista enquanto no "Local" 'pt_BR' eles estão próximos.
Em hexadecimal, a ordem se mantém o que muda é apenas para o contexto da localidade. Tanto que não é preciso usar LC_ALL em setlocale, apenas LC_COLLATE.
Obs.: Para ajustar a localidade tanto em Windows quanto em Linux em PHP 5+ use
setlocale(TIPO, 'pt_BR','ptb');
25/10/2013 2:10pm
(~11 anos atrás)
(~11 anos atrás)
Obrigado pela dica! Estava procurando isso a 2 dias já e não conseguia encontrar!!!