php 計算多個集合的笛卡爾積

假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積爲{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)} php

 

思路:先計算第一個集合和第二個集合的笛卡爾積,把結果保存爲一個新集合。 
而後再用新集合與下一個集合計算笛卡爾積,依此循環直到與最後一個集合計算笛卡爾積。數組

 

<?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);

?>

 

結果:spa

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碼女款
)code

相關文章
相關標籤/搜索