2012-11-07 334 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"); 
相關問題