Comment puis-je trier ce tableau d'objets par l'un de ses champs, comme 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
)
....
Voici une meilleure façon d'utiliser les fermetures
Veuillez noter que ce n'est pas dans la documentation de PHP mais si vous utilisez 5.3+, les fermetures sont prises en charge là où des arguments appelables peuvent être fournis.
la source
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
mais la fonction de comparaison est la même. En utilisant cela, vous devrez dupliquer le code pour la fermeture au lieu d'appeler uneprotected static
méthode que vous ne devriez définir qu'une seule fois dans la classe parente.Si vous souhaitez trier les valeurs entières:
MISE À JOUR avec la chaîne n'oubliez pas de convertir dans le même registre (supérieur ou inférieur)
la source
si vous utilisez php oop, vous devrez peut-être changer pour:
la source
Le même code sera avec le
count
champ.Plus de détails sur
usort
: http://ru2.php.net/usortBtw, d'où avez-vous obtenu ce tableau? J'espère que ce n'est pas de la base de données?
la source
$result
en faitTRUE
si c'est réussi, et votre comparaison devrait l'être$a->name > $b->name
. :)ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
mais je ne peux pas le faire fonctionner :( je reçois quelques avis et avertissement que usort s'attend à ce que le paramètre 2 soit un rappel valideVous pouvez utiliser cette fonction (fonctionne en version PHP> = 5.3):
Exemple:
la source
$a->{$key}
et$b->{$key}
plutôt que$a[$key]
et$b[$key]
comme nous le sommes, à proprement parler, traitant des propriétés plutôt que des membres du tableau, mais c'était toujours la réponse que je cherchais.Vous pouvez utiliser
usort
, comme ceci:la source
Si tout échoue, voici une autre solution:
la source
L'inconvénient de toutes les réponses ici est qu'elles utilisent des noms de champs statiques , j'ai donc écrit une version ajustée dans le style OOP. En supposant que vous utilisez des méthodes getter, vous pouvez utiliser directement cette classe et utiliser le nom de champ comme paramètre . Quelqu'un le trouve probablement utile.
la source
si vous voulez trier les dates
la source
Une alternative simple qui vous permet de déterminer dynamiquement le champ sur lequel se base le tri:
Ceci est basé sur la classe Closure , qui autorise les fonctions anonymes. Il est disponible depuis PHP 5.3.
la source
Si vous avez besoin d'une comparaison de chaînes locale, vous pouvez utiliser à la
strcoll
place destrcmp
.N'oubliez pas d'utiliser d'abord
setlocale
avecLC_COLLATE
pour définir les informations locales si nécessaire.la source
Si vous utilisez ceci dans Codeigniter, vous pouvez utiliser les méthodes:
@rmooney merci pour la suggestion. Ça m'aide vraiment.
la source
Merci pour les inspirations, j'ai aussi dû ajouter un paramètre $ translator externe
la source
Si vous devez trier par un seul champ,
usort
c'est un bon choix. Cependant, la solution devient rapidement compliquée si vous devez trier par plusieurs champs. Dans ce cas, la bibliothèque YaLinqo * peut être utilisée, qui implémente une syntaxe de requête de type SQL pour les tableaux et les objets. Il a une jolie syntaxe pour tous les cas:Voici
'$v->count'
un raccourci pourfunction ($v) { return $v->count; }
(l'un ou l'autre peut être utilisé). Ces chaînes de méthodes renvoient des itérateurs, mais vous pouvez obtenir des tableaux en ajoutant->toArray()
à la fin si vous en avez besoin.* développé par mes soins
la source
Vous pouvez utiliser la fonction triée de Nspl :
la source
C'est ce que j'ai pour une classe utilitaire
Appeler:
la source
Vous pouvez utiliser usort comme ceci
Si vous souhaitez trier par numéro:
Ou Abc char:
Voir plus: https://www.php.net/manual/en/function.usort.php
la source