You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP按元素频率排序数组并生成频率统计数组

实现数组元素频率统计并按频率降序排序

嘿,这个需求用PHP的内置函数就能很方便地实现,我给你一步步讲清楚:

步骤1:统计元素出现频率

首先用array_count_values()函数,它会直接帮你统计数组中每个元素的出现次数,返回一个键为原数组元素、值为对应出现次数的关联数组:

$recs = array(1,4,7,1,5,4,1,12,1,4,6,5);
// 统计每个元素的出现次数
$frequencies = array_count_values($recs);

这一步执行后,$frequencies会是:

array(1=>4, 4=>3, 7=>1, 5=>2, 12=>1, 6=>1)

步骤2:按频率降序排序,频率相同则按键升序排列

接下来我们需要对这个统计数组排序:优先按出现次数从高到低,次数相同的话按元素本身的大小升序(对应你示例里6在7前面的结果)。可以用uasort()自定义排序规则,它会保留数组的键关联:

// 自定义排序:先按频率降序,频率相同则按键升序
uasort($frequencies, function($valA, $valB, $keyA, $keyB) {
    if ($valA !== $valB) {
        // 频率不同,降序排列(大的在前)
        return $valB - $valA;
    } else {
        // 频率相同,按键的大小升序排列
        return $keyA - $keyB;
    }
}, ARRAY_USE_KEYS);

注意:ARRAY_USE_KEYS参数是PHP 7.4及以上版本才支持的,如果你的PHP版本较低,可以用另一种方式实现:

uasort($frequencies, function($a, $b) use ($frequencies) {
    if ($a != $b) {
        return $b - $a;
    }
    // 获取当前比较的键并排序
    $keys = array_keys($frequencies, $a);
    sort($keys);
    return $keys[0] === key($frequencies) ? -1 : 1;
});

最终结果

执行完上面的代码后,$frequencies就会接近你想要的格式:

array("1"=>4,"4"=>3,"5"=>2,"6"=>1,"7"=>1,"12"=>1)

注:你的示例结果里没有12,但原数组中12确实出现了1次,如果你需要排除某些元素,可以在排序后用unset($frequencies[12]);手动移除,或者在统计前先过滤数组。

内容的提问来源于stack exchange,提问作者DonxScott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:12:45