有一个数组:$arr=array(1,2,3,4),怎么算出他的所有组合,使结果:$jieguo=array(1,12,13,14,123,124,134,1234,2,23,24,234,3,34,4)//数组排序可以随意,只有组合都在就可以就是没有多余分数了!请高手帮忙?

解决方案 »

  1.   

    $arr = array(1,2,3,4);
    $result = array();function comb($tmp,&$ar,&$result) {
    $result[] = $tmp;
    if (strlen($tmp) < count($ar)) {
    for($i = 0; $i < count($ar); $i ++) comb($tmp.$ar[$i], $ar, $result);
    }
    }
    for($i = 0; $i < count($arr); $i ++) comb($arr[$i].'', &$arr, &$result);var_dump($result);
      

  2.   

    Array
    (
        [0] => 1
        [1] => 11
        [2] => 111
        [3] => 1111
        [4] => 1112
        [5] => 1113
        [6] => 1114
        [7] => 112
        [8] => 1121
        [9] => 1122
        [10] => 1123
        [11] => 1124
        [12] => 113
        [13] => 1131
        [14] => 1132
        [15] => 1133
        [16] => 1134
        [17] => 114
        [18] => 1141
        [19] => 1142
        [20] => 1143
        [21] => 1144
        [22] => 12
        [23] => 121
        [24] => 1211
        [25] => 1212
        [26] => 1213
        [27] => 1214
        [28] => 122
        [29] => 1221
        [30] => 1222
        [31] => 1223
        [32] => 1224
        [33] => 123
        [34] => 1231
        [35] => 1232
        [36] => 1233
        [37] => 1234
        [38] => 124
        [39] => 1241
        [40] => 1242
        [41] => 1243
        [42] => 1244
        [43] => 13
        [44] => 131
        [45] => 1311
        [46] => 1312
        [47] => 1313
        [48] => 1314
        [49] => 132
        [50] => 1321
        [51] => 1322
        [52] => 1323
        [53] => 1324
        [54] => 133
        [55] => 1331
        [56] => 1332
        [57] => 1333
        [58] => 1334
        [59] => 134
        [60] => 1341
        [61] => 1342
        [62] => 1343
        [63] => 1344
        [64] => 14
        [65] => 141
        [66] => 1411
        [67] => 1412
        [68] => 1413
        [69] => 1414
        [70] => 142
        [71] => 1421
        [72] => 1422
        [73] => 1423
        [74] => 1424
        [75] => 143
        [76] => 1431
        [77] => 1432
        [78] => 1433
        [79] => 1434
        [80] => 144
        [81] => 1441
        [82] => 1442
        [83] => 1443
        [84] => 1444
        [85] => 2
        [86] => 21
        [87] => 211
        [88] => 2111
        [89] => 2112
        [90] => 2113
        [91] => 2114
        [92] => 212
        [93] => 2121
        [94] => 2122
        [95] => 2123
        [96] => 2124
        [97] => 213
        [98] => 2131
        [99] => 2132
        [100] => 2133
        [101] => 2134
        [102] => 214
        [103] => 2141
        [104] => 2142
        [105] => 2143
        [106] => 2144
        [107] => 22
        [108] => 221
        [109] => 2211
        [110] => 2212
        [111] => 2213
        [112] => 2214
        [113] => 222
        [114] => 2221
        [115] => 2222
        [116] => 2223
        [117] => 2224
        [118] => 223
        [119] => 2231
        [120] => 2232
        [121] => 2233
        [122] => 2234
        [123] => 224
        [124] => 2241
        [125] => 2242
        [126] => 2243
        [127] => 2244
        [128] => 23
        [129] => 231
        [130] => 2311
        [131] => 2312
        [132] => 2313
        [133] => 2314
        [134] => 232
        [135] => 2321
        [136] => 2322
        [137] => 2323
        [138] => 2324
        [139] => 233
        [140] => 2331
        [141] => 2332
        [142] => 2333
        [143] => 2334
        [144] => 234
        [145] => 2341
        [146] => 2342
        [147] => 2343
        [148] => 2344
        [149] => 24
        [150] => 241
        [151] => 2411
        [152] => 2412
        [153] => 2413
        [154] => 2414
        [155] => 242
        [156] => 2421
        [157] => 2422
        [158] => 2423
        [159] => 2424
        [160] => 243
        [161] => 2431
        [162] => 2432
        [163] => 2433
        [164] => 2434
        [165] => 244
        [166] => 2441
        [167] => 2442
        [168] => 2443
        [169] => 2444
        [170] => 3
        [171] => 31
        [172] => 311
        [173] => 3111
        [174] => 3112
        [175] => 3113
        [176] => 3114
        [177] => 312
        [178] => 3121
        [179] => 3122
        [180] => 3123
        [181] => 3124
        [182] => 313
        [183] => 3131
        [184] => 3132
        [185] => 3133
        [186] => 3134
        [187] => 314
        [188] => 3141
        [189] => 3142
        [190] => 3143
        [191] => 3144
        [192] => 32
        [193] => 321
        [194] => 3211
        [195] => 3212
        [196] => 3213
        [197] => 3214
        [198] => 322
        [199] => 3221
        [200] => 3222
        [201] => 3223
        [202] => 3224
        [203] => 323
        [204] => 3231
        [205] => 3232
        [206] => 3233
        [207] => 3234
        [208] => 324
        [209] => 3241
        [210] => 3242
        [211] => 3243
        [212] => 3244
        [213] => 33
        [214] => 331
        [215] => 3311
        [216] => 3312
        [217] => 3313
        [218] => 3314
        [219] => 332
        [220] => 3321
        [221] => 3322
        [222] => 3323
        [223] => 3324
        [224] => 333
        [225] => 3331
        [226] => 3332
        [227] => 3333
        [228] => 3334
        [229] => 334
        [230] => 3341
        [231] => 3342
        [232] => 3343
        [233] => 3344
        [234] => 34
        [235] => 341
        [236] => 3411
        [237] => 3412
        [238] => 3413
        [239] => 3414
        [240] => 342
        [241] => 3421
        [242] => 3422
        [243] => 3423
        [244] => 3424
        [245] => 343
        [246] => 3431
        [247] => 3432
        [248] => 3433
        [249] => 3434
        [250] => 344
        [251] => 3441
        [252] => 3442
        [253] => 3443
        [254] => 3444
        [255] => 4
        [256] => 41
        [257] => 411
        [258] => 4111
        [259] => 4112
        [260] => 4113
        [261] => 4114
        [262] => 412
        [263] => 4121
        [264] => 4122
        [265] => 4123
        [266] => 4124
        [267] => 413
        [268] => 4131
        [269] => 4132
        [270] => 4133
        [271] => 4134
        [272] => 414
        [273] => 4141
        [274] => 4142
        [275] => 4143
        [276] => 4144
        [277] => 42
        [278] => 421
        [279] => 4211
        [280] => 4212
        [281] => 4213
        [282] => 4214
        [283] => 422
        [284] => 4221
        [285] => 4222
        [286] => 4223
        [287] => 4224
        [288] => 423
        [289] => 4231
        [290] => 4232
        [291] => 4233
        [292] => 4234
        [293] => 424
        [294] => 4241
        [295] => 4242
        [296] => 4243
        [297] => 4244
        [298] => 43
        [299] => 431
        [300] => 4311
        [301] => 4312
        [302] => 4313
        [303] => 4314
        [304] => 432
        [305] => 4321
        [306] => 4322
        [307] => 4323
        [308] => 4324
        [309] => 433
        [310] => 4331
        [311] => 4332
        [312] => 4333
        [313] => 4334
        [314] => 434
        [315] => 4341
        [316] => 4342
        [317] => 4343
        [318] => 4344
        [319] => 44
        [320] => 441
        [321] => 4411
        [322] => 4412
        [323] => 4413
        [324] => 4414
        [325] => 442
        [326] => 4421
        [327] => 4422
        [328] => 4423
        [329] => 4424
        [330] => 443
        [331] => 4431
        [332] => 4432
        [333] => 4433
        [334] => 4434
        [335] => 444
        [336] => 4441
        [337] => 4442
        [338] => 4443
        [339] => 4444
    )
      

  3.   

    $arr = array(1,2,3,4);
    $len = count($arr);
    $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 = '';
    for($j=0;$j<$len;++$j)
    {
    if($tmp{$j} == '1')
    {
    $t .= $arr[$j];
    }
    }
    $res[] = $t;
    }
    print_r($res);
    /*Array
    (
        [0] => 4
        [1] => 3
        [2] => 34
        [3] => 2
        [4] => 24
        [5] => 23
        [6] => 234
        [7] => 1
        [8] => 14
        [9] => 13
        [10] => 134
        [11] => 12
        [12] => 124
        [13] => 123
        [14] => 1234
    )
    */
      

  4.   

    写得比较复杂,用的都是笨办法,应该还可以优化的,但总算是实现了楼主的需求:
    $arr = array(1,2,3,4);
    $result = array();function comb($tmp,&$ar,&$result) {
       $result[] = $tmp;
       if (strlen($tmp) < count($ar)) {
          for($i = 0; $i < count($ar); $i ++) {
             if (stripos($tmp, $ar[$i].'') === false) comb($tmp.$ar[$i], $ar, $result);
          }
       }
    }
    for($i = 0; $i < count($arr); $i ++) comb($arr[$i].'', &$arr, &$result);echo "<pre>";
    //对结果数组二次处理,去重复项
    $arr_tmp = array();
    foreach($result as $v) {
       $v = str_split($v);
       sort($v);
       if (!in_array($v,$arr_tmp)) $arr_tmp[] = $v;
    }
    $result = array();
    foreach($arr_tmp as $v) $result[] = implode('',$v);
    print_r($result);
    Array
    (
        [0] => 1
        [1] => 12
        [2] => 123
        [3] => 1234
        [4] => 124
        [5] => 13
        [6] => 134
        [7] => 14
        [8] => 2
        [9] => 23
        [10] => 234
        [11] => 24
        [12] => 3
        [13] => 34
        [14] => 4
    )
      

  5.   

    #1.全组合有公式,4个数的全组合个数即是pow(2,4)-1 == 15
    #2.从1,到15循环,二进制标志为1的位置对应数组项
    假设$array = array(1,2,3,4)
    ===============================
    1(0001) --> $array[3] == 4
    2(0010) --> $array[2] == 3
    3(0011) --> $array[2].$array[3] == 34
    4(0100) --> $array[1] == 2
    .....
    .....
    .....
    15(1111)--> $array[0..3] == 1234
      

  6.   

    百度之星的那道题见http://blog.csdn.net/wxhlxx/archive/2011/06/04/6526376.aspx我修改了下百度之星的那个,PHP代码录下,可以修改$shuarr=array(1,2,3,4);做不同的测试
    <?php//分组,按组分,路4个数,那么有分成1,2,3,4组的情况
    $shuarr=array(1,2,3,4);//数字数组
    $save=array();//组合结果的保存数组
    //由数字个数可以知道分组方式 1--总数
    for($zhushu=1;$zhushu<=count($shuarr);$zhushu++){$jishu=1;//分组的计数,标记分到第几组
    $lian='';
    $lianarr=array($lian);//找到一种分组的所有有效的组合
    while($jishu<=$zhushu){$newarr=array();
    //循环处理链
    for($i=0;$i<count($lianarr);$i++){
    $lian=$lianarr[$i];
    //路过初始时,设置取的最小值,0
    if($lian==''){$min=0;//最小的取值,必须大于它}//end if($lian=='')else{$t=explode(',',$lian);$len=count($t)-1;
    $min=$t[$len];
    }//echo $pingjun;
    //路过大于等于最小限制,说明可以有链取
    for($i1=0;$i1<count($shuarr);$i1++){
    if($jishu==1)$newlian=$shuarr[$i1];
    else $newlian=$lian.','.$shuarr[$i1];if($jishu==$zhushu&&$shuarr[$i1]>$min)$save[]=$newlian;
    elseif($shuarr[$i1]>$min) $newarr[]=$newlian;
    }//end for($i1=$min;$i1<=$pingjun
    }//end for($i=0;$i<count($lianarr);$i++)
    $lianarr=$newarr;$jishu++;
    }//end while($jishu<=$zhushu)
    }//end for($zhushu=1;$zhushu<=$renshu;$zhushu++)echo '最后的组合的数组:';
    print_r($save);
    ?>