按外观数量排序PHP数组

时间:2012-07-17 17:53:25

标签: php arrays

简而言之,我想按每个成员出现的次数订购一个数组,然后删除重复数据。

所以这个:

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

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

5 个答案:

答案 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函数....