交叉合并二维数组,穷举可能性(不知道怎么起名字。。。)

本文介绍了一种使用PHP实现的二维数组交叉合并方法,通过穷举可能性来生成所有组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php

/**
 * @author Wangzhe 
 */
class Yoyi_Common_Array
{

    /**
     * 交叉合并二维数组,穷举可能性
     * @param type $nArray 任意二维数组
     * @author Nio.King 王哲
     * @return array 
     * @example
     * $arrData = array(
      'a' => array("a1", "a2", 'a3'),
      'b' => array("b1", "b2", 'b3', 'b4'),
      'c' => array("c1", "c2", 'c3','c4','c5'),
      );
      print_r(Yoyi_Common_Array::crossMerger($arrData));
     */
    public static function crossMerger($nArray)
    {
        $array = array();
        $keyArr = array();
        $result = array();
        $master = array();
        foreach ($nArray as $k => $item)
        {
            $keyArr[] = $k;
            $array[] = $item;
        }
        $sum = 0;
        for ($i = 0; $i < count($array); $i++)
        {
            if ($sum)
            {
                $sum *= count($array[$i]);
            } else
            {
                $sum = count($array[$i]);
            }
            $master[] = array(0, count($array[$i]));
        }

        $i = 0;
        //$result[] = $master;
        while (true)
        {
            $ok = $zhuizi = count($array) - 1;

            $master[$zhuizi][0]++;

            while (true)
            {

                if ($master[$zhuizi][0] >= $master[$zhuizi][1])
                {
                    $master[$zhuizi][0] = 0;
                    if (isset($master[$zhuizi - 1][0]))
                    {
                        $master[$zhuizi - 1][0]++;
                    }
                }
                $zhuizi--;
                if ($zhuizi < 0)
                {
                    $result[] = $master;
                    break;
                }
            }
            $i++;
            if ($i >= $sum)
            {
                break;
            }
        }




        $overResult = array();
        $realResult = array();
        for ($i = 0; $i < count($result); $i++)
        {
            foreach ($result[$i] as $key => $value)
            {
                if ($key >= 0)
                {
                    $overResult[$i][] = $value[0];
                }
            }
        }
        foreach ($overResult as $subArray)
        {
            $temp = array();
            foreach ($subArray as $k => $v)
            {
                $temp[$keyArr[$k]] = $array[$k][$v];
            }
            $realResult[] = $temp;
        }
        //while()
        return $realResult;
    }

}

?>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值