问一个组合问题?在线等? 有一个数组:$arr=array(1,2,3,4),怎么算出他的所有组合,使结果:$jieguo=array(1,12,13,14,123,124,134,1234,2,23,24,234,3,34,4)//数组排序可以随意,只有组合都在就可以就是没有多余分数了!请高手帮忙? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $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); 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) $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)*/ 写得比较复杂,用的都是笨办法,应该还可以优化的,但总算是实现了楼主的需求:$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) #1.全组合有公式,4个数的全组合个数即是pow(2,4)-1 == 15#2.从1,到15循环,二进制标志为1的位置对应数组项假设$array = array(1,2,3,4)===============================1(0001) --> $array[3] == 42(0010) --> $array[2] == 33(0011) --> $array[2].$array[3] == 344(0100) --> $array[1] == 2...............15(1111)--> $array[0..3] == 1234 百度之星的那道题见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];//路过初始时,设置取的最小值,0if($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);?> php和apache配置 smarty怎么得到缓存时间? php 使用JOSN该如何引用 招PHP开发人员(地点:杭州文二路),版主留情! 在php中 ,如何才能向asp中使用server.mappath("default.php")得到网站的物理目录? 急用php二级连动菜单,请高手指点 怎么把记录提交到数据库? PHP中如何实现像JSP中forward的功能 php里面 把字符变成数字的函数是什么? 41除以3 怎样用php遍历SQL一棵树的所有叶子取和? 我的sql 语句in,为什么用不了啊?
$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);
(
[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
)
$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
)
*/
$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
)
#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
<?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);
?>