2012-04-27 2 views
1

Учитывая массив объектов, хранящихся в $my_array, я хотел бы извлечь 2 объекта с самым высоким значением count и поместить их в отдельный массив объектов. Массив структурирован, как показано ниже.Массив объектов, извлекать максимальные значения

Как бы я это сделал?

array(1) { 
    [0]=> object(stdClass)#268 (3) { 
      ["term_id"]=> string(3) "486" 
      ["name"]=> string(4) "2012" 
      ["count"]=> string(2) "40" 
    } 
    [1]=> object(stdClass)#271 (3) { 
      ["term_id"]=> string(3) "488" 
      ["name"]=> string(8) "One more" 
      ["count"]=> string(2) "20" 
    } 
    [2]=> object(stdClass)#275 (3) { 
      ["term_id"]=> string(3) "512" 
      ["name"]=> string(8) "Two more" 
      ["count"]=> string(2) "50" 
    } 

ответ

5

Вы можете сделать это разными способами. Один довольно наивный способ был бы использовать usort() для сортировки массива, а затем палить последние два элемента:

usort($arr, function($a, $b) { 
    if ($a->count == $b->count) { 
     return 0; 
    } 

    return $a->count < $b->count ? -1 : 1 
}); 

$highest = array_slice($arr, -2, 2); 

Edit:

Обратите внимание, что предыдущий код использует анонимную функцию, которая доступно только в PHP 5.3+. Если вы используете < 5.3, вы можете просто использовать обычную функцию:

function myObjSort($a, $b) { 
    if ($a->count == $b->count) { 
     return 0; 
    } 

    return $a->count < $b->count ? -1 : 1 
} 

usort($arr, 'myObjSort'); 

$highest = array_slice($arr, -2, 2); 
+2

Стоит комментарий, что анонимная функция будет работать только в PHP 5.3+ – sberry

+0

@sberry: Спасибо, я сделаю к сведению. – FtDRbwLXw6

+0

+1 - выглядит хорошо для меня. – sberry

0

Вы можете использовать array_walk(), а затем написать функцию, которая проверяет значение счета.