php多维数组乘积

169 阅读2分钟

一个多维数组乘积的方法

之前在写淘宝相关业务的时候,看到了一段神仙代码,大概的逻辑是,如果商品有 1 个sku 属性就做一个单层循环,如果商品有 2 个sku 属性就做一个双层循环,如果商品有 3 个sku 属性就做一个双层循环。。。。 我就在想,如果要是商品的sku 属性有4、5、6(再多了也不太可能) 个,那启不是要再多写几层循环 本着,写出这样的代码就是作死的心,用在线php 运行了好多次之后,终于成功了

大概是思路是这样的,

如果我有三个数组,分别为[ 1,2 ] , ['a','b'] , ['A','B'] ----- 2 * 2 * 2 最后得出的数组应该是 8 个

第一步:算出第一个数组[ 1,2 ] 和第二个数组 ['a','b']的乘积 ----- 这一步得出一个新的数组[[1,'1'],[1,'b'],[2,'a'],[2,'b']]

第二步:用第一步得出的新数组[[1,'1'],[1,'b'],[2,'a'],[2,'b']] 与 第三个数组得出乘积 ['A','B'] 4 * 2 最后得出的数组应该是 8 个 ----- [[1,'a','A'],[1,'a','B'],[1,'b','A'],[1,'b','B'],[2,'a','A'],[2,'a','B'],[2,'b','A'],[2,'b','B']]

如果有更多的数组,则以此类推...

用这样的方法也可以有更多种结果输出,我这里因为需要用到这样的格式所以最后得出的是拼接起来的数组,这样也可以操作复杂的数据,其中有obj 也可以用。

    /**
     * 多个数组的乘积。
     *    例:输入[ [{'a':'1','b':'2'}], [{'A':'1','B':'2'},{'C':'3','D':'4'}]]
     *       输出[ [{'a':'1','b':'2'},{'A':'1','B':'2'}],[{'a':'1','b':'2'},{'C':'3','D':'4'}] ]
     * @author CitrusLimonc
     * @param array $arrays
     * @return array
     */
    function getArrByArrays($arrays){
        $lastArr = array();
        for ($i=0; $i < count($arrays); $i++) {
            if (count($lastArr) == 0) {
                $lastArr = $arrays[$i];
            }
            if ($i < count($arrays) - 1) {
                $nextArr = $arrays[$i + 1];
            } else {
                break;
            }
            $lastArr = $this->getNextValue($lastArr,$nextArr);
        }
        return $lastArr;
    }
    function getNextValue($lastArr,$nextArr){
        $newArr = array();
        for($i=0; $i< count($lastArr); $i++){
            for($j = 0; $j< count($nextArr); $j++){
                $v1 = $lastArr[$i];
                $v2 = $nextArr[$j];
                if (is_array($v1)) {
                    $v1[] = $v2;
                    $value = $v1;
                } else {
                    $value = array();
                    $value[] = $v1;
                    $value[] = $v2;
                }
                $newArr[] = $value;
            }
        }
        return $newArr;
    }