笛卡尔积又叫笛卡尔乘积,是一个叫笛卡尔的人提出来的。
简单的说就是两个集合相乘的结果。
具体的定义去看看有关代数系的书的定义。
直观的说就是
集合A{a1,a2,a3} 集合B{b1,b2}
他们的 笛卡尔积 是 A*B ={(a1,b1),(a1,b2),(a2,b1),(a2,b2),(a3,b1),(a3,b2)}
任意两个元素结合在一起

<?php
/**
 * php 计算多个集合的笛卡尔积
 * Date:    2017-01-10
 * Author:  fdipzone
 * Ver:     1.0
 *
 * Func
 * CartesianProduct 计算多个集合的笛卡尔积
 */

/**
 * 计算多个集合的笛卡尔积
 * @param  Array $sets 集合数组
 * @return Array
 */
function CartesianProduct($sets){

    // 保存结果
    $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('37码','38码','39码'),
    array('男款','女款')
);

$result = CartesianProduct($sets);
print_r($result);

输出:
Array
(
[0] => 白色透气37码男款
[1] => 白色透气37码女款
[2] => 白色透气38码男款
[3] => 白色透气38码女款
[4] => 白色透气39码男款
[5] => 白色透气39码女款
[6] => 白色防滑37码男款
[7] => 白色防滑37码女款
[8] => 白色防滑38码男款
[9] => 白色防滑38码女款
[10] => 白色防滑39码男款
[11] => 白色防滑39码女款
[12] => 黑色透气37码男款
[13] => 黑色透气37码女款
[14] => 黑色透气38码男款
[15] => 黑色透气38码女款
[16] => 黑色透气39码男款
[17] => 黑色透气39码女款
[18] => 黑色防滑37码男款
[19] => 黑色防滑37码女款
[20] => 黑色防滑38码男款
[21] => 黑色防滑38码女款
[22] => 黑色防滑39码男款
[23] => 黑色防滑39码女款
[24] => 红色透气37码男款
[25] => 红色透气37码女款
[26] => 红色透气38码男款
[27] => 红色透气38码女款
[28] => 红色透气39码男款
[29] => 红色透气39码女款
[30] => 红色防滑37码男款
[31] => 红色防滑37码女款
[32] => 红色防滑38码男款
[33] => 红色防滑38码女款
[34] => 红色防滑39码男款
[35] => 红色防滑39码女款
)