php 计算多个集合的笛卡尔乘积

假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
在做商城,我们会遇到选择商品规格不通的组合,这种组合数学上叫做笛卡尔乘积,我们用PHP来实现笛卡尔乘积。

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

/**
 * 计算多个集合的笛卡尔积
 * @param Array $sets 集合数组
 * @return Array
 */
function CartesianProduct($sets){
    if(count($sets)<=1){
        $result = $sets[0];
    }else {
        // 保存结果
        $result = array();
        // 循环遍历集合数据
        for ($i = 0, $count = count($sets); $i < $count - 1; $i++) {
            // 初始化
            if ($i == 0) {
                $result = $sets[$i];
            }
            // 保存临时数据
            $tmp = array();
            // 结果与下一个集合计算笛卡尔积
            foreach ($result as $res) {
                foreach ($sets[$i + 1] as $set) {
                    $tmp[] = $res . '-' . $set;
                }
            }
            // 将笛卡尔积写入结果
            $result = $tmp;
        }
    }
    return $result;
}
// 定义集合
$sets = array(
    array('亚麻布','纯棉'),
    array('蓝色','绿色'),
    array('XL','2XL','3XL')
);

$result = CartesianProduct($sets);
print_r($result);
Array
(
    [0] => 亚麻布-蓝色-XL
    [1] => 亚麻布-蓝色-2XL
    [2] => 亚麻布-蓝色-3XL
    [3] => 亚麻布-绿色-XL
    [4] => 亚麻布-绿色-2XL
    [5] => 亚麻布-绿色-3XL
    [6] => 纯棉-蓝色-XL
    [7] => 纯棉-蓝色-2XL
    [8] => 纯棉-蓝色-3XL
    [9] => 纯棉-绿色-XL
    [10] => 纯棉-绿色-2XL
    [11] => 纯棉-绿色-3XL
)

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对北漂的程序猿的支持。

《php 计算多个集合的笛卡尔乘积》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注