Получил многомерный массив, подобный этому:
[['key'=>'foo', 'Rating'=>5] , ['key'=>'bar', 'Rating'=>1] , ['key'=>'Tee', 'Rating'=>3] , ['key'=>'foo', 'Rating'=>10] , ['key'=>'foo', 'Rating'=>1]]
Я хочу удалить дубликаты на основе определенного ключа и системы рейтинга, сохраняя при этом исходную структуру массива, кроме клавиш индекса.
Итак, конечный результат должен выглядеть так:
[['key'=>'bar', 'Rating'=>1] , ['key'=>'Tee', 'Rating'=>3] , ['key'=>'foo', 'Rating'=>10]]
Я ищу эффективное решение этой проблемы.
В идеале функция array_unique()
которая принимает значение ключа в качестве параметра для поиска повторений для заданного массива и ключа Rating
.
array_key_unique($array, $uniqe_key, $Rating);
Мне было интересно, есть ли способ сделать это с помощью MySQL-запроса?
Как поясняет Раймонд Ниджланд в комментариях, лучше сделать это в запросе:
SELECT `key`, MAX(`Rating`) FROM `table_name` GROUP BY `key`
Но из-за того, что мне было скучно, зациклируйте и добавьте результат с самым высоким Rating
к результату:
foreach($array as $value) { if(!isset($result[$value['key']]) || $result[$value['key']]['Rating'] < $value['Rating']) { $result[$value['key']] = $value; } }
Или, сортируйте ASCending и извлеките массив с key
в качестве индекса для перезаписи дубликатов:
array_multisort(array_column($array, 'key'), array_column($array, 'Rating'), SORT_ASC, $array); $result = array_column($array, null, 'key');
В любом случае, чтобы повторно индексировать массив с целым числом, используйте:
$result = array_values($result);