假設集合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