我有这样的原始数组:
$arr=array(10,8,13,8,5,10,10,12);
并希望排序,最后成为:
$arr=array(10,10,10,8,8,13,12,5);
使用这种方式获得最终结果:
$arr=array(10,8,13,8,5,10,10,12);
// Remove array that contain array(1)
$arr_diff=array_diff(array_count_values($arr), array(1));
// Remove array that contain keys of $arr_diff
$arr=array_diff($arr, array_keys($arr_diff));
// Sort
rsort($arr);
ksort($arr_diff);
// unshift
foreach ($arr_diff as $k=>$v)
{
while ($v > 0)
{
array_unshift($arr,$k);
$v--;
}
}
// print_r($arr);
我的问题还有另一个更简单的方法吗?
感谢。
答案 0 :(得分:3)
$occurrences = array_count_values($arr);
usort($arr, function ($a, $b) use ($occurrences) {
// if the occurrence is equal (== 0), return value difference instead
return ($occurrences[$b] - $occurrences[$a]) ?: ($b - $a);
});
请参阅Reference: all basic ways to sort arrays and data in PHP。