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)}

實現思路

先計算第一個集合和第二個集合的笛卡爾積,把結果保存為一個新集合。

然后再用新集合與下一個集合計算笛卡爾積,依此循環直到與最后一個集合計算笛卡爾積。

例如有以下幾個集合,需要計算笛卡爾積

?
1
2
3
4
5
6
7
8
<?php
$sets = array (
  array ( '白色' , '黑色' , '紅色' ),
  array ( '透氣' , '防滑' ),
  array ( '37碼' , '38碼' , '39碼' ),
  array ( '男款' , '女款' )
);
?>

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?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 );
 
?>

輸出:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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碼女款
)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM