1. 程式人生 > >PHP笛卡爾積

PHP笛卡爾積

先附上原地址:https://www.cnblogs.com/ghjbk/p/6992743.html?utm_source=itdadao&utm_medium=referral

笛卡爾積

笛卡爾積是指在數學中,兩個集合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);

 

?>