Как в php сделать сортировку по 2 или более полям?

  1. Категория:
  2. Программирование
  3. php
Автор: elsa Тип контента: Вопрос Дата: 00:54 28-03-2024 Просмотров: 695 Ответов: 1
У меня есть массив пользователей.
Как мне отсортировать пользователей таким образом, чтобы онлайн пользователи были в самом верху списка. И при этом чтобы они еще были отсортированы по дате регистрации?
Новые на самом верху.
Нравится:
Loading...
0
Полезно:
Loading...
2
Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Автор: alexey
Дата: 20:37 03-10-2025
С ходу пока что пришел такой способ:
<php

$users = [
    ['id' => 1, 'name' => 'Виктор', 'online' => true, 'registered_at' => '1994-01-15'],
    ['id' => 2, 'name' => 'Иван', 'online' => false, 'registered_at' => '1980-03-20'],
    ['id' => 3, 'name' => 'Николай', 'online' => false, 'registered_at' => '1990-11-10'],
    ['id' => 4, 'name' => 'Илья', 'online' => true, 'registered_at' => '1991-01-05'],
    ['id' => 5, 'name' => 'Александр', 'online' => true, 'registered_at' => '1992-02-14'],
];

usort($users, function($a, $b) {
    // Сравнение по online статусу
    if ($a['online'] !== $b['online']) {
        // Online пользователи вверху списка
        return $b['online'] - $a['online'];
    }
    
    // Если статус одинаковый, то сравниваем по дате регистрации
    $dateA = strtotime($a['registered_at']);
    $dateB = strtotime($b['registered_at']);
    
    // Отправляем новых пользователей вверх списка
    return $dateB - $dateA;
});

print_r($users);

Результат:
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Виктор
            [online] => 1
            [registered_at] => 1994-01-15
        )

    [1] => Array
        (
            [id] => 5
            [name] => Александр
            [online] => 1
            [registered_at] => 1992-02-14
        )

    [2] => Array
        (
            [id] => 4
            [name] => Илья
            [online] => 1
            [registered_at] => 1991-01-05
        )

    [3] => Array
        (
            [id] => 3
            [name] => Николай
            [online] => 
            [registered_at] => 1990-11-10
        )

    [4] => Array
        (
            [id] => 2
            [name] => Иван
            [online] => 
            [registered_at] => 1980-03-20
        )
)

Нравится:
Loading...
1
Полезно:
Loading...
1
© 2024 Zambers.Ru All Rights Reserved.
Top.Mail.Ru

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем файлы cookies