4

简而言之,我想按每个成员出现的次数来排序一个数组,然后删除重复项。

所以这:

$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')

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

4

5 回答 5

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 )

这不会保留它首先看到的字母的顺序,它实际上只是根据它们在原始数组中的次数对它们进行排序。它可以用额外的逻辑进行修改,以添加一些其他的排序功能,比如在按实例排序后按字母顺序排序。

编辑:使用的函数array_count_values(),例如$count = array_count_values($unsorted),可以从上面替换整个“计数”循环。该函数的输出与我的循环产生的完全相同。感谢@Ana 的提示!

于 2012-07-17T18:07:59.113 回答
3

接受的答案并不理想,实际上是不正确的,因为它不保留键/值对或导致 OP 发布的输出。更简单的方法如下:

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

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

于 2012-07-17T18:14:36.383 回答
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:哇,其他答案和我的看起来很相似!我想我需要不那么慢

于 2012-07-17T17:56:58.623 回答
1

您可以尝试使用array_count_values,然后对返回的数组进行排序(使用asort),然后将键提取到另一个数组中。

于 2012-07-17T18:07:48.580 回答
0

在删除唯一值之前使用相同的usort函数....

于 2012-07-17T18:01:23.633 回答