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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:55:17