Сортировать массив объектов

У меня возникли проблемы с примерами в руководстве по PHP, поэтому я хотел бы спросить об этом здесь...

У меня есть массив объектов. Есть ли способ отсортировать его по содержимому объекта?

Например, мой массив:

Array
(
    [0] => stdClass Object
        (
            [id] => 123
            [alias] => mike
        )

    [1] => stdClass Object
        (
            [id] => 456
            [alias] => alice
        )

    [2] => stdClass Object
        (
            [id] => 789
            [alias] => zeke
        )

    [3] => stdClass Object
        (
            [id] => 987
            [alias] => dave
        )
)

Как отсортировать массив по [алиасу] объектов?

В примере вывод должен быть:

Array
(
    [0] => stdClass Object
        (
            [id] => 456
            [alias] => alice
        )

    [1] => stdClass Object
        (
            [id] => 987
            [alias] => dave
        )

    [2] => stdClass Object
        (
            [id] => 123
            [alias] => mike
        )

    [3] => stdClass Object
        (
            [id] => 789
            [alias] => zeke
        )
)

Заранее спасибо!


person Obay    schedule 23.01.2010    source источник


Ответы (2)


Используйте usort(). Вы указываете функцию для этого сравнения, и сортировка выполняется на основе этой функции. Например.:

function my_comparison($a, $b) {
  return strcmp($a->alias, $b->alias);
}

$arr = ...;

usort($arr, 'my_comparison');
person Max Shawabkeh    schedule 23.01.2010
comment
Что делать, если мне нужно отсортировать по названиям брендов, а затем по категориям для массива объекта Product? - person tom10271; 29.06.2015

Я думаю, что порядок отсутствует, я нашел эту другую функцию

<?php 
/** 
 * Sort array of objects by field. 
 * 
 * @autor Lea Hayes
 * @param array $objects Array of objects to sort. 
 * @param string $on Name of field. 
 * @param string $order (ASC|DESC) 
 */ 
function sort_on_field(&$objects, $on, $order = 'ASC') { 
    $comparer = ($order === 'DESC') 
        ? "return -strcmp(\$a->{$on},\$b->{$on});" 
        : "return strcmp(\$a->{$on},\$b->{$on});"; 
    usort($objects, create_function('$a,$b', $comparer)); 
}

$order = ($_GET['order'] === 'asc') ? 'ASC' : 'DESC';
sort_on_field($arr, 'alias', $order);
person brasofilo    schedule 03.05.2012