橡皮擦擦

商品集合的笛卡尔积算法

PHP

笛卡尔积

笛卡尔积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X*Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}

实现思路

先计算第一个集合和第二个集合的笛卡尔积,把结果保存为一个新集合。
然后再用新集合与下一个集合计算笛卡尔积,依此循环直到与最后一个集合计算笛卡尔积。

PHP函数

/**
* 计算多个集合的笛卡尔积
* @param Array $goods 集合
* @return Array
*/
public function CartesianProduct($goods)
{
    $returnData = [];

    for ($i=0; $i < count($goods)-1 ; $i++) { 
        
        // 初始化
        if($i == 0)
        {
            $returnData = $goods[$i];
        }

        $tempArray = []; // 临时数组

        foreach ($returnData as $val) {
            foreach ($goods[$i+1] as $v) {
                $tempArray[] = $val.'+'.$v;
            }
        }
        //重新赋值
        $returnData = $tempArray;
    }
    return $returnData;
}

样例数据

$goods = [
            ['白色','黑色','红色'],
            ['39','40','41','42','43'],
            ['普通款','加绒款'],
            ['男款','女款']
        ];

结果

Array
(
    [0] => 白色+39+普通款+男款
    [1] => 白色+39+普通款+女款
    [2] => 白色+39+加绒款+男款
    [3] => 白色+39+加绒款+女款
    [4] => 白色+40+普通款+男款
    [5] => 白色+40+普通款+女款
    [6] => 白色+40+加绒款+男款
    [7] => 白色+40+加绒款+女款
    [8] => 白色+41+普通款+男款
    [9] => 白色+41+普通款+女款
    [10] => 白色+41+加绒款+男款
    [11] => 白色+41+加绒款+女款
    [12] => 白色+42+普通款+男款
    [13] => 白色+42+普通款+女款
    [14] => 白色+42+加绒款+男款
    [15] => 白色+42+加绒款+女款
    [16] => 白色+43+普通款+男款
    [17] => 白色+43+普通款+女款
    [18] => 白色+43+加绒款+男款
    [19] => 白色+43+加绒款+女款
    [20] => 黑色+39+普通款+男款
    [21] => 黑色+39+普通款+女款
    [22] => 黑色+39+加绒款+男款
    [23] => 黑色+39+加绒款+女款
    [24] => 黑色+40+普通款+男款
    [25] => 黑色+40+普通款+女款
    [26] => 黑色+40+加绒款+男款
    [27] => 黑色+40+加绒款+女款
    [28] => 黑色+41+普通款+男款
    [29] => 黑色+41+普通款+女款
    [30] => 黑色+41+加绒款+男款
    [31] => 黑色+41+加绒款+女款
    [32] => 黑色+42+普通款+男款
    [33] => 黑色+42+普通款+女款
    [34] => 黑色+42+加绒款+男款
    [35] => 黑色+42+加绒款+女款
    [36] => 黑色+43+普通款+男款
    [37] => 黑色+43+普通款+女款
    [38] => 黑色+43+加绒款+男款
    [39] => 黑色+43+加绒款+女款
    [40] => 红色+39+普通款+男款
    [41] => 红色+39+普通款+女款
    [42] => 红色+39+加绒款+男款
    [43] => 红色+39+加绒款+女款
    [44] => 红色+40+普通款+男款
    [45] => 红色+40+普通款+女款
    [46] => 红色+40+加绒款+男款
    [47] => 红色+40+加绒款+女款
    [48] => 红色+41+普通款+男款
    [49] => 红色+41+普通款+女款
    [50] => 红色+41+加绒款+男款
    [51] => 红色+41+加绒款+女款
    [52] => 红色+42+普通款+男款
    [53] => 红色+42+普通款+女款
    [54] => 红色+42+加绒款+男款
    [55] => 红色+42+加绒款+女款
    [56] => 红色+43+普通款+男款
    [57] => 红色+43+普通款+女款
    [58] => 红色+43+加绒款+男款
    [59] => 红色+43+加绒款+女款
)

原文链接:https://blog.csdn.net/u011867622/article/details/99647280

点我评论
打赏本文
二维码


36

文章

6

分类