笛卡尔乘积代码:<?PHPfunction Descartes() {  
  $t = func_get_args();  
  if(func_num_args() == 1) return call_user_func_array( __FUNCTION__, $t[0] );   
  $a = array_shift($t);  
  if(! is_array($a)) $a = array($a);  
  $a = array_chunk($a, 1);  
  do {  
    $r = array();  
    $b = array_shift($t);  
    if(! is_array($b)) $b = array($b);  
    foreach($a as $p)  
        foreach(array_chunk($b, 1) as $q)  
            $r[] = array_merge($p, $q);  
    $a = $r;  
  }while($t);  
  return $r;  
}  $arr = array(  
  array('a1','a2'),  
  'b',  
  array('c1','c2'),  
  array('d1','d2','d3'),
  array('e1','e2','e3')
  //......省略其它元素(也可以是数组),  
);  
   
$r = Descartes( $arr );  
print_r($r);
?>//////////////////////////////////////输出:Array
(
    [0] => Array
        (
            [0] => a1
            [1] => b
            [2] => c1
            [3] => d1
            [4] => e1
        )
    [1] => Array
        (
            [0] => a1
            [1] => b
            [2] => c1
            [3] => d1
            [4] => e2
        )
      ...

////////////////////
现在我只想要3个元素,第一个元素要有a1或a2。那段代码要怎么改?
Array
(
    [0] => Array
        (
            [0] => a1
            [1] => b
            [2] => c1
        )
      ......
    [1] => Array
        (
            [0] => a2
            [1] => c2
            [2] => d3
        )
      ......

解决方案 »

  1.   

    对于
    $arr = array(   
      array('a1','a2'),   
      'b',   
      array('c1','c2'),   
      array('d1','d2','d3'),
      array('e1','e2','e3')
      //......省略其它元素(也可以是数组),   
    );  
    需先对
    $arr = array(   
      'b',   
      array('c1','c2'),   
      array('d1','d2','d3'),
      array('e1','e2','e3')
      //......省略其它元素(也可以是数组),   
    );
    求 M 取 2 的组合
    $c = combination($arr, 2);
    然后对组合的结果求笛卡尔积$r = array();
    foreach($c as $v)
      $r = array_merge($r, Descartes( array('a1','a2'), $v[0], $v[1] )); 
    print_r($r);
    Array
    (
        [0] => Array
            (
                [0] => a1
                [1] => d1
                [2] => e1
            )    [1] => Array
            (
                [0] => a1
                [1] => d1
                [2] => e2
            )    [2] => Array
            (
                [0] => a1
                [1] => d1
                [2] => e3
            )    [3] => Array
            (
                [0] => a1
                [1] => d2
                [2] => e1
            )    [4] => Array
            (
                [0] => a1
                [1] => d2
                [2] => e2
            )    [5] => Array
            (
                [0] => a1
                [1] => d2
                [2] => e3
            )    [6] => Array
            (
                [0] => a1
                [1] => d3
                [2] => e1
            )    [7] => Array
            (
                [0] => a1
                [1] => d3
                [2] => e2
            )    [8] => Array
            (
                [0] => a1
                [1] => d3
                [2] => e3
            )    [9] => Array
            (
                [0] => a2
                [1] => d1
                [2] => e1
            )    [10] => Array
            (
                [0] => a2
                [1] => d1
                [2] => e2
            )    [11] => Array
            (
                [0] => a2
                [1] => d1
                [2] => e3
            )    [12] => Array
            (
                [0] => a2
                [1] => d2
                [2] => e1
            )    [13] => Array
            (
                [0] => a2
                [1] => d2
                [2] => e2
            )    [14] => Array
            (
                [0] => a2
                [1] => d2
                [2] => e3
            )    [15] => Array
            (
                [0] => a2
                [1] => d3
                [2] => e1
            )    [16] => Array
            (
                [0] => a2
                [1] => d3
                [2] => e2
            )    [17] => Array
            (
                [0] => a2
                [1] => d3
                [2] => e3
            )    [18] => Array
            (
                [0] => a1
                [1] => c1
                [2] => e1
            )    [19] => Array
            (
                [0] => a1
                [1] => c1
                [2] => e2
            )    [20] => Array
            (
                [0] => a1
                [1] => c1
                [2] => e3
            )    [21] => Array
            (
                [0] => a1
                [1] => c2
                [2] => e1
            )    [22] => Array
            (
                [0] => a1
                [1] => c2
                [2] => e2
            )    [23] => Array
            (
                [0] => a1
                [1] => c2
                [2] => e3
            )    [24] => Array
            (
                [0] => a2
                [1] => c1
                [2] => e1
            )    [25] => Array
            (
                [0] => a2
                [1] => c1
                [2] => e2
            )    [26] => Array
            (
                [0] => a2
                [1] => c1
                [2] => e3
            )    [27] => Array
            (
                [0] => a2
                [1] => c2
                [2] => e1
            )    [28] => Array
            (
                [0] => a2
                [1] => c2
                [2] => e2
            )    [29] => Array
            (
                [0] => a2
                [1] => c2
                [2] => e3
            )    [30] => Array
            (
                [0] => a1
                [1] => c1
                [2] => d1
            )    [31] => Array
            (
                [0] => a1
                [1] => c1
                [2] => d2
            )    [32] => Array
            (
                [0] => a1
                [1] => c1
                [2] => d3
            )    [33] => Array
            (
                [0] => a1
                [1] => c2
                [2] => d1
            )    [34] => Array
            (
                [0] => a1
                [1] => c2
                [2] => d2
            )    [35] => Array
            (
                [0] => a1
                [1] => c2
                [2] => d3
            )    [36] => Array
            (
                [0] => a2
                [1] => c1
                [2] => d1
            )    [37] => Array
            (
                [0] => a2
                [1] => c1
                [2] => d2
            )    [38] => Array
            (
                [0] => a2
                [1] => c1
                [2] => d3
            )    [39] => Array
            (
                [0] => a2
                [1] => c2
                [2] => d1
            )    [40] => Array
            (
                [0] => a2
                [1] => c2
                [2] => d2
            )    [41] => Array
            (
                [0] => a2
                [1] => c2
                [2] => d3
            )    [42] => Array
            (
                [0] => a1
                [1] => b
                [2] => e1
            )    [43] => Array
            (
                [0] => a1
                [1] => b
                [2] => e2
            )    [44] => Array
            (
                [0] => a1
                [1] => b
                [2] => e3
            )    [45] => Array
            (
                [0] => a2
                [1] => b
                [2] => e1
            )    [46] => Array
            (
                [0] => a2
                [1] => b
                [2] => e2
            )    [47] => Array
            (
                [0] => a2
                [1] => b
                [2] => e3
            )    [48] => Array
            (
                [0] => a1
                [1] => b
                [2] => d1
            )    [49] => Array
            (
                [0] => a1
                [1] => b
                [2] => d2
            )    [50] => Array
            (
                [0] => a1
                [1] => b
                [2] => d3
            )    [51] => Array
            (
                [0] => a2
                [1] => b
                [2] => d1
            )    [52] => Array
            (
                [0] => a2
                [1] => b
                [2] => d2
            )    [53] => Array
            (
                [0] => a2
                [1] => b
                [2] => d3
            )    [54] => Array
            (
                [0] => a1
                [1] => b
                [2] => c1
            )    [55] => Array
            (
                [0] => a1
                [1] => b
                [2] => c2
            )    [56] => Array
            (
                [0] => a2
                [1] => b
                [2] => c1
            )    [57] => Array
            (
                [0] => a2
                [1] => b
                [2] => c2
            ))
      

  2.   

    求组合函数可用这个function combination( $arr, $num=0) {
      $len = count($arr);
      if($num == 0) $num = $len;
      $res = array();
      for($i=1,$n=pow(2, $len);$i<$n;++$i) {
        $tmp = str_pad(base_convert($i, 10, 2), $len, '0', STR_PAD_LEFT);
        $t = array();
        for($j=0;$j<$len;++$j) {
          if($tmp{$j} == '1') {
            $t[] = $arr[$j];
          }
        }
        if(count($t) == $num) $res[] = $t;
      }
      return $res;
    }