$arr = array(
  array(
   a1,
        a2,
  ),
  b,
  array(
        c1,
        c2,
  ),
);
已知一个数组(如上代码),数组只有2层(a1,a2,c1,c2不为数组)。。怎样写一个方法让数组得到这样的字符串:a1bc1,a1bc2,a2bc1,a2bc2不管子数组有多少个,每个数组有多少项,每个数组取一个,要得到所有的组合。

解决方案 »

  1.   

    有且只有两层,使用嵌套循环就行了,最简单了foreach(arr[0] as a){
        foreach(arr[1] as b )
            echo a.b;
    }
      

  2.   

    foreach ($arr[0] as $val)
    {
    foreach ($arr[2] as  $val2)
    {
    echo $val . $arr[1]  . $val2;
    }
    }
      

  3.   

    数组只有2层:不是说$arr只包含2个数组元素。
    也可以是这样:
    $arr = array(
      array(a1,a2,),
      b,
      array(c1,c2,),
      array(d1,d2,d3),
      //......省略其它元素(也可以是数组),
    );
    如果是上述情况应该得到12组情况。
      

  4.   

    $arr = array(
      array(a1,a2,),
      b,
      array(c1,c2,),
      array(d1,d2,d3),
      //......省略其它元素(也可以是数组),
    );
    $r = Descartes( $arr );
    print_r($r);
    Array
    (
        [0] => Array
            (
                [0] => a1
                [1] => b
                [2] => c1
                [3] => d1
            )    [1] => Array
            (
                [0] => a1
                [1] => b
                [2] => c1
                [3] => d2
            )    [2] => Array
            (
                [0] => a1
                [1] => b
                [2] => c1
                [3] => d3
            )    [3] => Array
            (
                [0] => a1
                [1] => b
                [2] => c2
                [3] => d1
            )    [4] => Array
            (
                [0] => a1
                [1] => b
                [2] => c2
                [3] => d2
            )    [5] => Array
            (
                [0] => a1
                [1] => b
                [2] => c2
                [3] => d3
            )    [6] => Array
            (
                [0] => a2
                [1] => b
                [2] => c1
                [3] => d1
            )    [7] => Array
            (
                [0] => a2
                [1] => b
                [2] => c1
                [3] => d2
            )    [8] => Array
            (
                [0] => a2
                [1] => b
                [2] => c1
                [3] => d3
            )    [9] => Array
            (
                [0] => a2
                [1] => b
                [2] => c2
                [3] => d1
            )    [10] => Array
            (
                [0] => a2
                [1] => b
                [2] => c2
                [3] => d2
            )    [11] => Array
            (
                [0] => a2
                [1] => b
                [2] => c2
                [3] => d3
            ))
    记得前几天已给出了函数 Descartes 的代码
      

  5.   

    另类解法
    //$conn 是mysql数据库连接资源
    $arr = array(
      array('a1','a2',),
      'b',
      array('c1','c2',),
      array('d1','d2','d3'),
      //......省略其它元素(也可以是数组),
    );$sql = "";
    foreach($arr AS $key => $val)
    {
    $tmp = is_array($val) ? "(SELECT '" . implode("' union SELECT '", $val) . "') AS tb_{$key}" : "(SELECT '{$val}') tb_{$key}";
    $sql .= !empty($sql) ? " CROSS JOIN " . $tmp : $tmp;
    }
    $sql = "SELECT * FROM " . $sql;
    $query = mysql_query($sql, $conn);
    while($r = mysql_fetch_assoc($query))
    {
    echo join($r) . "\n";
    }
    /**
    输出
    a1bc1d1
    a2bc1d1
    a1bc2d1
    a2bc2d1
    a1bc1d2
    a2bc1d2
    a1bc2d2
    a2bc2d2
    a1bc1d3
    a2bc1d3
    a1bc2d3
    a2bc2d3
    /**/
      

  6.   

    找到你回答的帖子了。可以实现,不过有一点点bug(当$arr=array('a')或者$arr=array(array('a1','s2'))时,第一个if判断有问题)。
    function 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;
    }
      

  7.   


    <?php
    function comb($arrs) {
    if (count($arrs) > 1) {
    $temp = array();
    foreach ($arrs[0] as $key => $n1) {
    foreach ($arrs[1] as $n2) array_push($temp, "$n1$n2");
    }
    array_splice($arrs, 0, 2, array($temp));
    return comb($arrs);
    } else {
    return $arrs[0];
    }
    }//--------------测试----------------+$arrs = array(
    array(1, 2),
    array(3, 4),
    array(5, 6, 7),
    array('a', 'b', 'c')
    );foreach (comb($arrs) as $val) echo "$val<br>";/*
     135a
    135b
    135c
    136a
    136b
    136c
    137a
    137b
    137c
    145a
    145b
    145c
    146a
    146b
    146c
    147a
    147b
    147c
    235a
    235b
    235c
    236a
    236b
    236c
    237a
    237b
    237c
    245a
    245b
    245c
    246a
    246b
    246c
    247a
    247b
    247c
    */
    ?>