如何按照每个对象的属性对一个对象数组进行排序

3
我有一个存储在$restrictedEvents变量中的数据数组,这些数据是从eventbrite.com api返回的。以下是数据示例,仅代表完整数组中约80个stdClass对象中的一个事件。
我想按照每个stdClass对象中[title]键的字母顺序对此数组进行排序。我尝试使用:
usort($restrictedEvents, "title");

然而,这会返回以下错误:
Warning: usort() [function.usort]: Invalid comparison function in model.php on line 109

我猜测它无法找到标题键,因为它在下一级。请指出我哪里做错了,以及如何按标题排序将不胜感激。非常感谢。
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
    )
4个回答

10
< p > usort 的第二个参数应该是一个函数。请参见http://php.net/manual/en/function.usort.php。您需要传递一个像这样的函数:

function cmp($a, $b)
{
    return strcmp($a->title, $b->title);
}
我认为您可以像这样调用它:usort($restrictedEvents, "cmp");

2
由于他正在处理一个stdclass而不是数组,因此需要return strcmp($a->title, $b->title);,但除此之外应该可以工作。 - Beardy

3

1
< p > usort 的第二个参数是一个函数,而不是键名。该函数会传递被排序的数组中的两个元素,并返回一个值,指示这两个元素相对于彼此应如何排序:如果它们传递到函数中的顺序是正确的,则返回 -1,如果相反,则返回 1,如果无所谓(在比较方面两个元素相等),则返回 0。以下是您的情况的示例:

usort($restrictedEvents, 
      function($a, $b) { return strcmp($a->title, $b->title); });

如果您使用的是旧版 PHP(在 5.3.0 之前,引入匿名函数之前),那么您必须为比较函数命名,并将该名称作为字符串传递给 usort

function titlecmp($a, $b) {
  return strcmp($a->title, $b->title); 
}
usort($restrictedEvents, "titlecmp");

-1
通常情况下,可以通过第二个数组来实现类似以下代码的排序:$keyToSort => $id,然后使用标准排序函数或自己编写的排序函数对该数组进行排序,最后将其转换成第一个数组即可。
使用这种方法,您的数组深度是没有限制的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接