6

Сортировка массива объектов по одному свойству

7

Как отсортировать этот массив объектов по одному из его полей, таким как name или count?

Вот пример массива:

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [name] => Mary Jane
            [count] => 420
        )

    [1] => stdClass Object
        (
            [ID] => 2
            [name] => Johnny
            [count] => 234
        )

    [2] => stdClass Object
        (
            [ID] => 3
            [name] => Kathy
            [count] => 4354
        )

   ....
)

Мне нужна помощь в том, как правильно выполнить сортировку. Буду благодарен за примеры кода!

5 ответ(ов)

5

Есть более элегантный способ сделать это, используя замыкания:

usort($your_data, function($a, $b) {
    return strcmp($a->name, $b->name);
});

Обратите внимание, что это не описано в документации PHP, но если вы используете версии 5.3 и выше, здесь поддерживаются замыкания, и можно передавать функции обратного вызова.

0

Если вам нужно сортировать целые числа, вы можете использовать функцию usort следующим образом:

// Сортировка по убыванию
usort($array, function($first, $second) {
    return $first->number < $second->number;
});

// Сортировка по возрастанию
usort($array, function($first, $second) {
    return $first->number > $second->number;
});

ОбНОВЛЕНИЕ При работе со строками не забудьте привести их к одному регистру (верхний или нижний):

// Сортировка по убыванию
usort($array, function($first, $second) {
    return strtolower($first->text) < strtolower($second->text);
});

// Сортировка по возрастанию
usort($array, function($first, $second) {
    return strtolower($first->text) > strtolower($second->text);
});

Таким образом вы сможете корректно сортировать ваши массивы как с целыми числами, так и со строками, учитывая регистр.

0

Если вы используете ООП в PHP, возможно, вам потребуется изменить код следующим образом:

public static function cmp($a, $b) 
{
    return strcmp($a->name, $b->name);
}

// в этом случае FUNCTION_NAME будет cmp
usort($your_data, array('YOUR_CLASS_NAME', 'FUNCTION_NAME')); 

Таким образом, метод cmp будет использоваться для сортировки массива $your_data на основе свойства name объектов. Не забудьте заменить YOUR_CLASS_NAME на имя вашего класса и FUNCTION_NAME на имя вашего метода, если оно отличается. Это позволит вам кастомизировать порядок сортировки в соответствии с вашими требованиями.

0

Для сортировки массива объектов по полю name в PHP используется функция usort. Пример кода выглядит следующим образом:

usort($array, 'my_sort_function');

var_dump($array);

function my_sort_function($a, $b)
{
    return $a->name <=> $b->name; // Используем оператор космического корабля для корректной сортировки
}

Такой код позволит отсортировать массив $array в порядке возрастания значений поля name объектов внутри этого массива.

Если вы хотите сортировать по полю count, код будет аналогичным:

usort($array, 'my_sort_function');

var_dump($array);

function my_sort_function($a, $b)
{
    return $a->count <=> $b->count; // Сортировка по полю count
}

Обратите внимание, что для корректной работы функции сравнения необходимо использовать оператор космического корабля <=>, который возвращает -1, 0 или 1 в зависимости от того, меньше ли первое значение, равно или больше второго.

Что касается вашего вопроса о том, откуда был взят массив, важно отметить, что если он был получен из базы данных, следует убедиться, что данные извлекаются и обрабатываются должным образом перед сортировкой.

0

Если все остальные варианты не подошли, вот еще одно решение:

$names = array(); 
foreach ($my_array as $my_object) {
    $names[] = $my_object->name; // любое поле объекта
}

array_multisort($names, SORT_ASC, $my_array);

return $my_array;

Это решение использует функцию array_multisort, чтобы отсортировать массив объектов $my_array по значению поля name. Сначала мы создаем массив $names, который заполняется значениями поля name для каждого объекта в массиве. Затем мы сортируем массив объектов на основе этого массива. В результате вы получите отсортированный массив объектов, где порядок определяется алфавитным порядком значений поля name.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь