如何按值的出现次数对数组进行排序?

4

我有以下数组:

$name_arr = array('raj','raj','ganesh','rahul','ganesh','mayur','raj','rahul');

我希望按照以下方式对其进行排序:
$final_arr = array('raj','raj','raj','ganesh','ganesh','rahul','rahul','mayur');

我该如何实现它?
4个回答

7
array_count_valuesarsort 是一种简单的方法:
$array = array_count_values($name_arr); //get all occurrences of each values
arsort($array);
print_r($array);//print occurrences array
$final_array = array();

foreach($array as $key=>$val){ // iterate over occurrences array
  for($i=0;$i<$val;$i++){ //apply loop based on occurrences number
    $final_array[] = $key; // assign same name to the final array
  }
}

print_r($final_array); // print final array

输出:- https://eval.in/847428


2
这是计算上昂贵的 - 对于这个问题有更简单的解决方案。 - localheinz

4

使用 array_count_valuesarray_fillarray_merge 函数。

第一步:使用 array_count_values 函数可以获得如下形式的值出现次数的数组。

Array ( [raj] => 3 [ganesh] => 2 [rahul] => 2 [mayur] => 1 )

第二步:应用arsort()。按照值降序排列。

第三步:循环该数组并基于计数制作新数组,使用array_fill填充该数组。

第四步:然后合并数组。

<?php

$name_arr = array('raj','raj','ganesh','rahul','ganesh','mayur','raj','rahul');

$new_arr = array_count_values($name_arr);

arsort($new_arr);

$value=array();

foreach($new_arr as $key=>$val){

   $value= array_merge($value,array_fill(0,$val,$key));
}

print_r($value);

?>

这是计算上昂贵的 - 对于这个问题有更简单的解决方案。 - localheinz
使用n作为数组的大小,您会调用array_merge()array_fill() n次。 - localheinz
不是的,但这不是最好的解决方案。 - localheinz
这不是最佳解决方案,也不是错误的解决方案。@localheinz - JYoThI

4

最简单的解决方法是使用内置函数array_count_values()usort()

<?php

$name_arr = array('raj','raj','ganesh','rahul','ganesh','mayur','raj','rahul');

$valueCount = array_count_values($name_arr);

$final_arr = $name_arr;

usort($final_arr, function ($a, $b) use ($valueCount) {
    return $valueCount[$b] - $valueCount[$a];
});

var_dump($final_arr);

参考资料:

示例:


注:本文档为it技术相关内容,涉及php函数的使用。

1
既然您坚持认为重建数组更加昂贵……那么重复调用比较函数是否更加便宜就不确定了。 - deceze
即便如此,仍然保持高可读性的前提下,这是最少的代码量,你不觉得吗,@deceze? - localheinz
1
我完全同意这一点,对于小数组来说,无论性能如何,这都是首选,因为它很可能足够快 - deceze
代码似乎无法正常工作 - $final_arr 实际上没有按出现次数排序。 - HynekS

-2
<?php

$name_arr = array('raj','raj','ganesh','rahul','ganesh','mayur','raj','rahul');

rsort($name_arr);

print_r($name_arr);

输出

Array (raj , raj , raj , rahul , rahul, mayur, ganesh, ganesh )

这可能适用于特定的数组,但它并不能通用地解决原帖中提出的问题。请参见http://php.net/manual/de/function.rsort.php。 - localheinz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接