Как отсортировать массив несколько раз с помощью usort
Есть массив из комментариев, у каждого коммента есть id_photo и comm_date. Я отсортировал по ИД, а с совпадающими ИД комментарии сортируются по дате так что старые сверху, новые ниже.
function sort_arr_by_id_photo($a, $b) {
if($a['id_photo'] < $b['id_photo']) return 1;
if($a['id_photo'] > $b['id_photo']) return -1;
if($a['id_photo'] == $b['id_photo'])
return ($a['comm_date'] < $b['comm_date']) ? -1 : 1;
}
Проблема в том, что наверху висит комментарий к фото с самым большим ИД, а нужно чтобы эта структура была отсортирована по дате, чтобы наверху висело фото с самым свежим комментарием. Как это сделать?
Ответы (1 шт):
Если хотите, чтобы сверху было фото с самым свежими комментами, то надо для начала найти дату последнего коммента для каждого фото, а не сортировать по photo_id.
Синтаксически, самый быстрый, наверное, способ получить это перечень - сортировка по комментарием, а потом array_column
usort($data, function($a,$b){ return $a['comm_date'] - $b['comm_date']; })
$pdates = array_column($data, 'comm_date', 'photo_id');
тут при проходе в array_column все предыдущие значения с однаковым photo_id будут заменяться новыми, с более новым comm_date, в итоге получим максимум.
Но в целом, конечно, для поиска максимума не надо использовать сортировку, это решается одним простым циклом.
а вот далее надо организовать функцию сравнения с использованием полученного массива.
usort($data, function($a,$b) use ($pdates){
$x = $pdates[$a['photo_id']] <=> $pdates[$b['photo_id']];
return $x != 0 ? $x
: $a['comm_date'] <=> $b['comm_date'];
});