按出现次数对PHP数组进行排序

5
简而言之,我想按每个元素出现的次数排序数组,然后去除重复项。
所以这样:
$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')

那么,我该怎么做呢?提前感谢您。

2
输入数组是否总是按字母顺序排列? - Bailey Parker
不好意思,我会更新我的问题以使其更明显。 - Alfo
4个回答

3

一个快速的方法是构建一个数组/映射,统计原始数组中每个字母/条目的出现次数,对计数后的结果进行排序,然后从排序列表中获取唯一值(按顺序)。

以下是一个示例实现:

<?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 )

这并不保留它首先看到的字母的顺序,实际上只是根据它们在原始数组中出现的次数进行排序。可以通过添加其他逻辑来修改它,以添加一些其他排序功能,例如在按实例排序后按字母顺序排序。
编辑:使用$count = array_count_values($unsorted)这样的函数可以替换上面的整个“计数”循环。该函数的输出与我的循环产生的完全相同。感谢@Ana给出的提示!

3

接受的答案并不理想,实际上是错误的,因为它没有保留键/值对或产生OP发布的输出结果。更简单的方法是:

function sortAndUnique($array)
{
  arsort($array);
  $array = array_count_values($array);
  arsort($array, SORT_NUMERIC);
  return $array;
}

这首先按字母顺序对数组进行排序,然后按最常出现的值进行排序,然后对这些值进行数字排序。


我的答案虽然正确,但效率极低。我建议在生产代码中不要使用它。 - DylanReile
这个答案没有返回期望的结果。需要返回的是生成的键。https://3v4l.org/mDvtN - mickmackusa

1
我建议首先对其进行单词计数,然后根据项目计数重新构建数组。
编辑:以下基本代码片段可能对您有用。它可以实现您想要的功能,但我会质疑在除了微不足道的情况下,为什么要创建与最终循环一样多的数组。
$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:哇,那个答案和我的看起来很像!我想我需要更快一些。


-1

在删除唯一值之前,使用 usort 函数进行排序...


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