我想根据每个成员出现的次数对数组进行排序,然后删除重复项。
所以这个:
$array = array('s', 'h', 'c', 'b', 'a', 'b', 'd', 'e', 'f', 'f', 'g')
首先订购的是:
['b', 'b', 'f', 'f', 's', 'h', 'c', 'a', 'd', 'e', 'g']
然后删除重复项:
$array = array_unique($array);
看起来像这样:
['b', 'f', 's', 'h', 'c', 'a', 'd', 'e', 'g']
那么,我该怎么做?
一种快速的方法是构建一个数组/映射,对原始数组中每个字母/条目的每个实例进行计数,对计数的字母/条目进行排序,然后从排序列表中获取唯一值(按顺序)。
一个示例实现是:
<?php
$unsorted = array('a', 'b', 'c', 'b', 'd', 'e', 'f', 'f', 'g');
// build an array that "counts" each instance/entry
$count = array();
foreach ($unsorted as $key) {
if (!isset($count[$key])) $count[$key] = 0;
$count[$key]++;
}
// sort the counted array in reverse order (to be "descending")
arsort($count, SORT_NUMERIC);
// copy each of the keys of `$count`, in-order, into a new array
$sorted = array();
foreach ($count as $key=>$count) $sorted[] = $key;
print_r($sorted);
?>
这给出了输出:
Array( [0] => f [1] => b [2] => e [3] => g [4] => d [5] => c [6] => a )
这不会保留它首先看到的字母的顺序,它实际上只是根据它们在原始数组中出现的次数对它们进行排序。可以使用额外的逻辑对其进行修改,以添加一些其他排序功能,例如在按实例排序后按字母顺序排序。
编辑: 函数
array_count_values()
,例如$count = array_count_values($unsorted)
,可以替换上面的整个“计数”循环。该函数的输出与我的循环产生的输出完全相同。感谢@Ana 的提示!
接受的答案并不理想,实际上是不正确的,因为它不保留键/值对或导致OP发布的输出。更简单的方法如下:
function sortAndUnique($array)
{
arsort($array);
$array = array_count_values($array);
arsort($array, SORT_NUMERIC);
return $array;
}
首先按字母顺序排列数组,然后按最常出现的值进行排序,然后按数字对这些值进行排序。
我建议首先对它进行字数统计,然后根据项目计数重建一个数组。
编辑:以下基本片段可能对您有用。 它可以满足您的要求,尽管我质疑使用低效创建与最终循环一样多的数组来处理除了微不足道的情况之外的任何事情。
$array = array('cat', 'dog', 'fish', 'fish');
$counts = array();
foreach ($array as $v)
{
$counts[$v]++;
}
arsort($counts);
$array = array();
foreach ($counts as $k => $v)
{
// $array = array_merge($array, array_fill(0, $v, $k));
// ok, remove duplicates
$array[] = $v;
}
print_r($array);
编辑2:哇,另一个答案和我的看起来很相似! 我想我需要慢一点
要维护按出现次数排序的值之间的原始值顺序,请使用以下命令。
对
array_count_values()
的结果进行排序不会保留值的原始顺序。 删除重复项后,使用 usort()
按出现次数的降序“稳定排序”值。
代码:(演示)
$array = ['s', 'h', 'c', 'b', 'a', 'b', 'd', 'e', 'f', 'f', 'g'];
$counts = array_count_values($array);
$array = array_unique($array);
usort($array, fn($a, $b) => $counts[$b] <=> $counts[$a]);
var_export($array);
输出:
array (
0 => 'b',
1 => 'f',
2 => 's',
3 => 'h',
4 => 'c',
5 => 'a',
6 => 'd',
7 => 'e',
8 => 'g',
)
在删除唯一值之前使用 usort 函数进行相同的操作....