+1

Como ordenar um vetor com valores UTF-8?

criado por Rubens Takiguti Ribeiro em 01/03/2010 12:16am
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):

// 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);"

Lista de Respostas:

0
02/03/2010 5:18pm
(~6 anos atrás)
Marcos Regis respondeu:
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');



0
25/10/2013 2:10pm
(~3 anos atrás)
AgenciaHollo respondeu:
Obrigado pela dica! Estava procurando isso a 2 dias já e não conseguia encontrar!!!

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)