2012-11-07 333 views
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 
    ) 

回答

9

第二个参数usort应该是一个函数。见http://php.net/manual/en/function.usort.php。您将需要通过它的功能,如:

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

我想,那么你会这样称呼它usort($restrictedEvents, "cmp");

+2

因为他处理的是stdclass而不是数组,所以它需要返回strcmp($ a-> title,$ b-> title);',但除此之外它应该可以工作。 – Beardy

+0

@Beardy谢谢你指出。刚更新了答案。 –

+0

非常感谢你回答这个问题! –

-1

通常像这样通过与$keyToSort => $id,排序此通过非标准排序功能阵列或您自己的第二阵列来实现,那么你就用这个,深度转换到你的第一个阵列

你的阵列是无限的。

1

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"); 
相关问题