简而言之,我想按每个成员出现的次数订购一个数组,然后删除重复数据。
所以这个:
$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')
那么,我该怎么做?提前谢谢。
答案 0 :(得分: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的提示!
答案 1 :(得分:3)
接受的答案并不理想,实际上是错误的,因为它不保留键/值配对或导致OP发布的输出。更简单的方法是:
function sortAndUnique($array)
{
arsort($array);
$array = array_count_values($array);
arsort($array, SORT_NUMERIC);
return $array;
}
首先对数组进行按字母顺序排列,然后按最常出现的值进行排序,然后按数字对这些值进行排序。
答案 2 :(得分: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:哇,那个答案和我看起来很相似!猜猜我需要减慢速度
答案 3 :(得分:1)
您可以尝试使用array_count_values,然后对返回的数组进行排序(使用asort),然后将密钥提取到另一个数组中。
答案 4 :(得分:0)
使用usort函数....