Comment trier un tableau d'objets par une propriété de chaque objet
J'ai un tableau de données renvoyées par le eventbrite.com api stockée dans une variable appelée $restrictedEvents qui ressemble les données ci-dessous. Ceci est représentatif d'un événement pour les fins de la coller ici, mais il a un environ 80 stdClass Objets de ce genre dans toute la gamme.
Je veux trier ce tableau dans l'ordre alphabétique par le [titre] dans chaque Objet stdClass. J'ai essayé d'utiliser:
usort($restrictedEvents, "title");
Toutefois cela renvoie l'erreur suivante:
Warning: usort() [function.usort]: Invalid comparison function in model.php on line 109
Ma conjecture est qu'il ne peut pas trouver la clé titre que c'est dans le niveau inférieur. Pointeur sur l'endroit où je vais mal et comment je peux trier par le titre serait grandement apprécié. Merci beaucoup.
Array
(
[4791063199] => stdClass Object
(
[box_header_text_color] => 393837
[link_color] => EE6600
[box_background_color] => FFFFFF
[box_border_color] => D9D4D0
[timezone] => Europe/London
[organizer] => stdClass Object
(
[url] => http://www.eventbrite.com/org/2866607767
[description] =>
[long_description] =>
[id] => 2866607767
[name] => B&Q Manifestival
)
[background_color] => E3DFDC
[id] => 4791063199
[category] =>
[box_header_background_color] => F0ECE9
[capacity] => 20
[num_attendee_rows] => 0
[title] => Closed Event Test
[start_date] => 2012-11-07 19:00:00
[status] => Live
[description] => Lorem ipsum
[end_date] => 2012-11-07 21:00:00
[tags] =>
[timezone_offset] => GMT+0000
[text_color] => 393837
[title_text_color] =>
[password] =>
[tickets] => Array
(
[0] => stdClass Object
(
[ticket] => stdClass Object
(
[description] =>
[end_date] => 2012-11-07 17:00:00
[min] => 1
[max] => 1
[price] => 0.00
[quantity_sold] => 0
[visible] => true
[currency] => GBP
[quantity_available] => 20
[type] => 0
[id] => 15940001
[name] => Manifestival Event
)
)
)
[created] => 2012-11-07 10:40:36
[url] => http://www.eventbrite.com/event/4791063199
[box_text_color] => 393837
[privacy] => Private
[venue] => stdClass Object
(
[city] =>
[name] => HR Training Room
[country] =>
[region] =>
[longitude] => 0
[postal_code] =>
[address_2] =>
[address] =>
[latitude] => 0
[country_code] =>
[id] => 2619469
[Lat-Long] => 0.0 / 0.0
)
[modified] => 2012-11-07 10:47:20
[repeats] => no
)
OriginalL'auteur Ben Paton | 2012-11-07
Vous devez vous connecter pour publier un commentaire.
La deuxième paramater à
usort
devrait être une fonction. Voir http://php.net/manual/en/function.usort.php. Vous avez besoin de passer une fonction comme:Je pense que vous serait alors l'appeler comme
usort($restrictedEvents, "cmp");
.return strcmp($a->title, $b->title);
, mais en dehors de cela, il doit travailler.Merci pour cette remarque. Juste mis à jour la réponse.
Merci beaucoup pour répondre à cette travaillé à!
OriginalL'auteur Joshua Dwire
Vous pouvez le faire avec ouzo goodies:
http://ouzo.readthedocs.org/en/latest/utils/comparators.html
OriginalL'auteur woru
Le deuxième paramètre à
usort
est une fonction, pas un nom de clé. La fonction reçoit deux éléments du tableau à trier et retourne une valeur indiquant comment ces deux éléments doivent être commandés à l'égard les uns des autres: -1 si l'ordre dans lequel ils sont passé à la fonction est correcte, 1 si c'est inversé, et 0 si elle n'a pas d'importance (les deux éléments sont égaux pour autant que la comparaison va). Voici un exemple pour ton cas:Si vous êtes sur une ancienne PHP (avant 5.3.0, qui a introduit les fonctions anonymes), alors vous avez à donner à la fonction de comparaison d'un nom et de nom comme une chaîne de caractères à
usort
:OriginalL'auteur Mark Reed
Généralement quelque chose comme ceci est réalisé par l'intermédiaire d'un second tableau avec
$keyToSort => $id
, trier ce tableau via le standart fonctions de tri ou de votre propre, alors vous avez une conversion de votre premier tableauà l'aide de cette, la profondeur de votre tableau est sans limite.
OriginalL'auteur Vengarioth