php 二维数组组合并排序

本文介绍了一种使用PHP实现的数组组合算法,通过递归函数实现多维数组元素的全排列组合,适用于需要对多组数据进行交叉匹配的场景。

像这样的数组

Array
(
    [0] => Array
        (
            [0] => 1101
            [3] => 1102
        )

    [1] => Array
        (
            [0] => 3304
            [1] => 3305
        )

    [2] => Array
        (
            [0] => 4408
            [2] => 4409
            [5] => 4412
        )

    [3] => Array
        (
            [0] => 1111
            [1] => 6666
        )

)

排列成下面这样的效果:

Array
(
    [0] => 1101:3304:4408:1111
    [1] => 1101:3304:4408:6666
    [2] => 1101:3304:4409:1111
    [3] => 1101:3304:4409:6666
    [4] => 1101:3304:4412:1111
    [5] => 1101:3304:4412:6666
    [6] => 1101:3305:4408:1111
    [7] => 1101:3305:4408:6666
    [8] => 1101:3305:4409:1111
    [9] => 1101:3305:4409:6666
    [10] => 1101:3305:4412:1111
    [11] => 1101:3305:4412:6666
    [12] => 1102:3304:4408:1111
    [13] => 1102:3304:4408:6666
    [14] => 1102:3304:4409:1111
    [15] => 1102:3304:4409:6666
    [16] => 1102:3304:4412:1111
    [17] => 1102:3304:4412:6666
    [18] => 1102:3305:4408:1111
    [19] => 1102:3305:4408:6666
    [20] => 1102:3305:4409:1111
    [21] => 1102:3305:4409:6666
    [22] => 1102:3305:4412:1111
    [23] => 1102:3305:4412:6666
)

直接上代码吧:

 

        //组合函数
        function zuhe($arr, $cnt)
        {
            if ($cnt == 1) {
                return $arr[0];
            }
            $dataArr = $arr;
            unset($dataArr[0]);
            $newdata = [];
            $cnt2 = count($arr);
            $ret = zuhe(array_values($dataArr), ($cnt - 1));
            foreach ($arr[$cnt2 - $cnt] as $alv) {
                foreach ($ret as $rv) {
                    if (is_array($rv)) {
                        array_unshift($rv, $alv);
                        $newdata[] = array_values($rv);
                    } else {
                        $newdata[] = [$alv,$rv];
                    }
                }
            }
            return $newdata;
        }

        //$arc 是一个二维数组
        foreach ($arc as $k=>&$v){
            $v = array_unique($v); //如果数组中有重复,可以先去重;
        }

        $cnt = count($arc);  //数组长度
        $resu = zuhe($arc, $cnt);
        foreach ($resu as &$av) {
                $av = implode(':', $av);  //以什么排列组合
        }

        $resu = array_merge(array_unique($resu));  //去重并重新定义键值

        //打印效果
        echo '<pre style="padding: 5px;border-radius: 4px;background: #ddd;border: 1px solid #ccc">';
        print_r($resu);
        echo '</pre>';die();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aldsong123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值