如何在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
相关产品推荐
相关产品推荐

