Задать вопрос
@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, не получилось

Есть правильное решение данной задачи?
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽