Como posso classificar essa matriz de objetos por um de seus campos, como name
ou count
?
Array
(
[0] => stdClass Object
(
[ID] => 1
[name] => Mary Jane
[count] => 420
)
[1] => stdClass Object
(
[ID] => 2
[name] => Johnny
[count] => 234
)
[2] => stdClass Object
(
[ID] => 3
[name] => Kathy
[count] => 4354
)
....
Aqui está uma maneira melhor de usar fechos
Observe que isso não está na documentação do PHP, mas se você usar os fechamentos 5.3+, há suporte para argumentos que podem ser fornecidos.
fonte
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
mas a função de comparação é a mesma. Usando isso, você precisará duplicar o código para o fechamento, em vez de fazer uma chamada para umprotected static
método que você precisará definir apenas uma vez na classe pai.Se você deseja classificar valores inteiros:
ATUALIZADO com a string, não se esqueça de converter para o mesmo registro (superior ou inferior)
fonte
se você estiver usando o php oop, pode ser necessário mudar para:
fonte
O mesmo código estará com o
count
campoMais detalhes sobre
usort
: http://ru2.php.net/usortAliás, de onde você tirou essa matriz? Espero que não do banco de dados?
fonte
$result
, conteráTRUE
se for bem-sucedido e sua comparação deve ser$a->name > $b->name
. :)ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
mas não consigo fazê-lo funcionar :( Recebo alguns avisos e aviso de que usort espera o parâmetro 2 para ser um callback válidoVocê pode usar esta função (funciona na versão PHP> = 5.3):
Exemplo:
fonte
$a->{$key}
e$b->{$key}
ao invés de$a[$key]
e$b[$key]
como estamos, estritamente falando, lidando com propriedades, e não com membros da matriz, mas essa ainda era a resposta que eu estava procurando.Você pode usar
usort
, assim:fonte
Se tudo falhar aqui, há outra solução:
fonte
A desvantagem de todas as respostas aqui é que elas usam nomes de campos estáticos , então escrevi uma versão ajustada no estilo OOP. Supondo que você esteja usando métodos getter, poderá usar diretamente essa classe e usar o nome do campo como parâmetro . Provavelmente alguém acha útil.
fonte
se você quiser classificar datas
fonte
Uma alternativa simples que permite determinar dinamicamente o campo no qual a classificação se baseia:
Isso é baseado na classe Closure , que permite funções anônimas. Está disponível desde o PHP 5.3.
fonte
Se você precisar de comparação de cadeias com base local, poderá usar em
strcoll
vez destrcmp
.Lembre-se de usar primeiro
setlocale
comLC_COLLATE
para definir informações de localidade, se necessário.fonte
Se você estiver usando isso dentro do Codeigniter, poderá usar os métodos:
@rmooney obrigado pela sugestão. Isso realmente me ajuda.
fonte
Obrigado pelas inspirações, eu também tive que adicionar um parâmetro $ translator externo
fonte
Se você precisar classificar por apenas um campo,
usort
é uma boa escolha. No entanto, a solução rapidamente se torna confusa se você precisar classificar por vários campos. Nesse caso, a biblioteca do YaLinqo * pode ser usada, o que implementa sintaxe de consulta semelhante ao SQL para matrizes e objetos. Tem uma sintaxe bonita para todos os casos:Aqui
'$v->count'
está uma abreviação defunction ($v) { return $v->count; }
(qualquer um pode ser usado). Essas cadeias de métodos retornam iteradores, mas você pode obter matrizes adicionando->toArray()
no final, se necessário.* desenvolvido por mim
fonte
Você pode usar a função classificada do Nspl :
fonte
Isto é o que eu tenho para uma classe de utilidade
Chame-o:
fonte
Você pode usar usort como este
Se você deseja classificar por número:
Ou char ABC:
Veja mais: https://www.php.net/manual/en/function.usort.php
fonte