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
(~15 anos atrás)
(~15 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!!!