本帖最后由 sibang 于 2013-10-16 22:08:17 编辑

解决方案 »

  1.   

    $arr=Array(
        Array('a','b','c'),
        Array('d','e','f'),
        Array('g','h','i'),
        //第二層array的個數是未知的,爲了方便舉例所以只寫了3個
    );
     
    print_r(iArray($arr,3));
    print_r(iArray($arr,2));
     
    function iArray($ar, $n) {
      if($n == 2) { //3取2的组合
        $ar = array(
          array($ar[0], $ar[1]),
          array($ar[0], $ar[2]),
          array($ar[1], $ar[2]),
        );
      }else $ar = array($ar);
      $res = array();
      foreach($ar as $d) {
        $r = array_pop($d);
        while($d) {
          $t = array();
          foreach(array_pop($d) as $x)
            foreach($r as $y) $t[] = $x . $y;
          $r = $t;
        }
        $res = array_merge($res, $r);
      }
      return $res;
    }
    Array
    (
        [0] => adg
        [1] => adh
        [2] => adi
        [3] => aeg
        [4] => aeh
        [5] => aei
        [6] => afg
        [7] => afh
        [8] => afi
        [9] => bdg
        [10] => bdh
        [11] => bdi
        [12] => beg
        [13] => beh
        [14] => bei
        [15] => bfg
        [16] => bfh
        [17] => bfi
        [18] => cdg
        [19] => cdh
        [20] => cdi
        [21] => ceg
        [22] => ceh
        [23] => cei
        [24] => cfg
        [25] => cfh
        [26] => cfi
    )
    Array
    (
        [0] => ad
        [1] => ae
        [2] => af
        [3] => bd
        [4] => be
        [5] => bf
        [6] => cd
        [7] => ce
        [8] => cf
        [9] => ag
        [10] => ah
        [11] => ai
        [12] => bg
        [13] => bh
        [14] => bi
        [15] => cg
        [16] => ch
        [17] => ci
        [18] => dg
        [19] => dh
        [20] => di
        [21] => eg
        [22] => eh
        [23] => ei
        [24] => fg
        [25] => fh
        [26] => fi
    )
      

  2.   

    數據可能是:
    $arr=Array(
        Array('a','b','c','j'),
        Array('d','e','f'),
        Array('g','h','i'),
        Array('k','l','m'),
    );也可能是:
    $arr=Array(
        Array('a','b','c','j'),
        Array('d','e','f'),
        Array('g','h','i'),
        Array('k','l','m'),
        Array('2','1','3','sd','ee'),
    );
      

  3.   

    iArray($ar,$n)
    $n的取值範圍是:  2~6
      

  4.   

    我在代码中已经提示了要先求一下 M取N 的组合
    而求组合的函数相信你的代码库中已经是有的
    这是我用的// combination 组合
    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;
    }所以 iArray 函数就可写作function iArray($ar, $n) {
      $res = array();
      foreach(combination($ar, $n) as $d) {
        $r = array_pop($d);
        while($d) {
          $t = array();
          foreach(array_pop($d) as $x)
            foreach($r as $y) $t[] = $x . $y;
          $r = $t;
        }
        $res = array_merge($res, $r);
      }
      return $res;
    }