如何用PHP或排序实现数据锯齿排列:将a,a,a,b,b,b转为a,b,a,b,a,b
解决重复序列转锯齿状排列的PHP实现
为什么usort不适用?
usort是基于自定义比较逻辑对数组进行排序,而锯齿状排列(如a,b,a,b)不是依赖元素的大小/优先级排序,而是需要按元素类型交替出现的规则重新编排数组,因此排序函数无法直接满足需求,需要换用数组重构的思路。
方法一:统计元素计数后交替取值
通过统计每个元素的出现次数,循环遍历所有元素类型,每次取出一个元素直到所有元素都被取用完毕:
function zigzagRearrange(array $input): array { // 统计每个元素的出现次数 $counts = array_count_values($input); $uniqueElements = array_keys($counts); $result = []; // 循环直到所有元素都被取出 while (array_sum($counts) > 0) { foreach ($uniqueElements as $element) { if ($counts[$element] > 0) { $result[] = $element; $counts[$element]--; } } } return $result; } // 测试示例 $original = ['a', 'a', 'a', 'b', 'b', 'b']; print_r(zigzagRearrange($original)); // 输出:Array ( [0] => a [1] => b [2] => a [3] => b [4] => a [5] => b )
方法二:分组后按索引合并
先将相同元素分组,再按索引逐个从每个组中取元素,实现交替排列:
$original = ['a', 'a', 'a', 'b', 'b', 'b']; // 将相同元素分组 $groups = []; foreach ($original as $item) { $groups[$item][] = $item; } $result = []; $maxGroupLength = max(array_map('count', $groups)); // 按索引遍历每个组,取对应位置的元素 for ($i = 0; $i < $maxGroupLength; $i++) { foreach ($groups as $group) { if (isset($group[$i])) { $result[] = $group[$i]; } } } print_r($result); // 输出与方法一一致
扩展场景说明
以上两种方法同样适用于多元素的情况,比如输入['a','a','a','b','b','c'],会输出['a','b','c','a','b','a'],符合锯齿状排列的逻辑。
内容的提问来源于stack exchange,提问作者fadhila edu
相关产品推荐
相关产品推荐

