@hebrian_vasyl
Веб-разработчик

Как в PHP сортировать с групировкой по полю?

Добрый день,

Есть массив с жалобами от пользователей, нужно отсортировать так, что бы первыми показывались старые жалобы, но групировались по email.

Тоесть, нужно сортировать массив по двум полям
- date
- email

Прикрепил скриншот, где в первой колонке сортировка по дате, а во второй по дате с групировкой по email.
60a2b26d46602697248274.jpeg

Вот такой массив:
$allTickets = array(
	array(
		'date' => '2021-05-05 15:00:00',
		'email' => 'aaa@gmail.com'
	),
	array(
		'date' => '2021-05-05 14:00:00',
		'email' => 'bbb@gmail.com'
	),
	array(
		'date' => '2021-05-05 13:00:00',
		'email' => 'aaa@gmail.com'
	),
	array(
		'date' => '2021-05-05 12:00:00',
		'email' => 'bbb@gmail.com'
	),
	array(
		'date' => '2021-04-02 14:00:00',
		'email' => 'ccc@gmail.com'
	),
	array(
		'date' => '2021-05-02 12:00:00',
		'email' => 'bbb@gmail.com'
	),
	array(
		'date' => '2021-05-02 11:00:00',
		'email' => 'aaa@gmail.com'
	),
	array(
		'date' => '2021-05-01 11:00:00',
		'email' => 'bbb@gmail.com'
	),
	array(
		'date' => '2021-05-01 10:00:00',
		'email' => 'aaa@gmail.com'
	)
);


Должно вывести так
2021-04-02 14:00:00 - ccc@
2021-05-01 10:00:00 - aaa@
2021-05-02 11:00:00 - aaa@
2021-05-05 13:00:00 - aaa@
2021-05-05 15:00:00 - aaa@
2021-05-01 11:00:00 - bbb@
2021-05-02 12:00:00 - bbb@
2021-05-05 12:00:00 - bbb@
2021-05-05 14:00:00 - bbb@

Пробовал через array_multisort, не получилось

Есть правильное решение данной задачи?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Сортировка по email, затем сортировка по date

usort
usort($allTickets, function($a, $b) {
    return [$a['email'], $a['date']]
           <=>
           [$b['email'], $b['date']];
});

print_r($allTickets);


usort (PHP 7.4+)
<?php
usort($allTickets, fn($a, $b) =>
    [$a['email'], $a['date']]
    <=>
    [$b['email'], $b['date']]
);

print_r($allTickets);


array_multisort
<?php
array_multisort(
    array_column($allTickets, 'email'),
    array_column($allTickets, 'date'),
    $allTickets
);

print_r($allTickets);


Должно вывести так

В приведённом примере не ясно почему ccc@ находится в начале, если сперва мы делали сортировку по email?

но групировались по email.

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

p.s. Если данные получаете из СУБД то сортировку можно сделать сразу в базе
SELECT ... ORDER BY email ASC, date ASC
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы