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

如何在PHP中按元素出现次数对数组进行排序?

按元素出现次数对PHP数组排序的解决方案

没问题,我来帮你搞定这个需求!你想要把数组按元素出现的次数从多到少排序,同时保留每个元素的重复项对吧?下面是具体的实现步骤和代码:

步骤1:准备原数组并统计元素频率

首先我们先定义你的原数组,然后用array_count_values()函数统计每个元素的出现次数,这个函数会返回一个键为原数组元素、值为对应出现次数的关联数组。

$originalArray = [
    'Switzerland',
    'Switzerland',
    'Switzerland',
    'Switzerland',
    'Italy',
    'Italy',
    'Germany',
    'France',
    'France',
    'France'
];

// 统计每个元素的出现次数
$frequency = array_count_values($originalArray);

步骤2:按频率降序排序数组

接下来用usort()函数结合自定义的比较逻辑,根据元素的出现次数对原数组进行排序。比较函数会先对比两个元素的出现次数,次数多的排在前面:

// 按出现次数降序排序
usort($originalArray, function($a, $b) use ($frequency) {
    // 优先按次数降序排列
    if ($frequency[$a] !== $frequency[$b]) {
        return $frequency[$b] - $frequency[$a];
    }
    // 如果次数相同,保持元素在原数组中的相对顺序(可选,让排序更稳定)
    return 0;
});

// 打印排序后的数组
print_r($originalArray);

运行结果

执行这段代码后,你会得到期望的排序结果:

Array
(
    [0] => Switzerland
    [1] => Switzerland
    [2] => Switzerland
    [3] => Switzerland
    [4] => France
    [5] => France
    [6] => France
    [7] => Italy
    [8] => Italy
    [9] => Germany
)

补充:稳定排序(处理次数相同的元素)

如果你的数组里有出现次数相同的元素,且希望它们保持在原数组中的先后顺序(稳定排序),可以用下面的方法——因为usort()本身是不稳定排序,可能会打乱次数相同元素的原顺序:

// 给原数组元素带上原索引
$indexedArray = array_map(function($value, $index) {
    return ['value' => $value, 'index' => $index];
}, $originalArray, array_keys($originalArray));

// 排序逻辑:先按频率降序,再按原索引升序
usort($indexedArray, function($a, $b) use ($frequency) {
    if ($frequency[$a['value']] !== $frequency[$b['value']]) {
        return $frequency[$b['value']] - $frequency[$a['value']];
    }
    // 次数相同时,原索引小的排在前面,保持原顺序
    return $a['index'] - $b['index'];
});

// 提取排序后的元素值
$sortedArray = array_column($indexedArray, 'value');

print_r($sortedArray);

这样就能确保次数相同的元素不会打乱原有的相对顺序啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:44:06