当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP笛卡尔积实现原理及代码实例

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-03 10:04:57 浏览: 评论:0 

笛卡尔积是指在数学中,两个集合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. <?php 
  2. $sets = array
  3. array('白色','黑色','红色'), 
  4. array('透气','防滑'), 
  5. array('37码','38码','39码'), 
  6. array('男款','女款'
  7. ); 
  8. ?> 

代码如下:

  1. <?php 
  2. /** 
  3.  * php 计算多个集合的笛卡尔积 
  4.  * Date: 2017-01-10 
  5.  * Author: fdipzone 
  6.  * Ver: 1.0 
  7.  * 
  8.  * Func 
  9.  * CartesianProduct 计算多个集合的笛卡尔积 
  10.  */ 
  11.    
  12. /** 
  13.  * 计算多个集合的笛卡尔积 
  14.  * @param Array $sets 集合数组 
  15.  * @return Array 
  16.  */ 
  17. function CartesianProduct($sets){ 
  18.    
  19.  // 保存结果 
  20.  $result = array(); 
  21.    
  22.  // 循环遍历集合数据 
  23.  for($i=0,$count=count($sets); $i<$count-1; $i++){ 
  24.    
  25.  // 初始化 
  26.  if($i==0){ 
  27.  $result = $sets[$i]; 
  28.  } 
  29.    
  30.  // 保存临时数据 
  31.  $tmp = array(); 
  32.    
  33.  // 结果与下一个集合计算笛卡尔积 
  34.  foreach($result as $res){ 
  35.  foreach($sets[$i+1] as $set){ 
  36.  $tmp[] = $res.$set
  37.  } 
  38.  } 
  39.    
  40.  // 将笛卡尔积写入结果 
  41.  $result = $tmp
  42.    
  43.  } 
  44.    
  45.  return $result
  46.    
  47.    
  48. // 定义集合 
  49. $sets = array
  50.  array('白色','黑色','红色'), 
  51.  array('透气','防滑'), 
  52.  array('37码','38码','39码'), 
  53.  array('男款','女款'
  54. ); 
  55.    
  56. $result = CartesianProduct($sets); 
  57. print_r($result); 
  58.    
  59. ?> 

输出:

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

Tags: PHP笛卡尔积

分享到: