急.....数字重组计算问题 本帖最后由 staryjk 于 2013-05-15 12:58:27 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 样例:1->02->013->01重组后的号码为000,001,010,011,总数为4 这个意思?$ar = array('0123','01234','678',);print_r(foo($ar));function foo(&$ar, $i=0) { $res = array(); if($i+1 <count($ar)) { $t = foo($ar, $i+1); foreach(str_split($ar[$i]) as $v) { foreach($t as $r) $res[] = $v . $r; } }else $res = str_split($ar[$i]); return $res;}Array( [0] => 006 [1] => 007 [2] => 008 [3] => 016 [4] => 017 [5] => 018 [6] => 026 [7] => 027 [8] => 028 [9] => 036 [10] => 037 [11] => 038 [12] => 046 [13] => 047 [14] => 048 [15] => 106 [16] => 107 [17] => 108 [18] => 116 [19] => 117 [20] => 118 [21] => 126 [22] => 127 [23] => 128 [24] => 136 [25] => 137 [26] => 138 [27] => 146 [28] => 147 [29] => 148 [30] => 206 [31] => 207 [32] => 208 [33] => 216 [34] => 217 [35] => 218 [36] => 226 [37] => 227 [38] => 228 [39] => 236 [40] => 237 [41] => 238 [42] => 246 [43] => 247 [44] => 248 [45] => 306 [46] => 307 [47] => 308 [48] => 316 [49] => 317 [50] => 318 [51] => 326 [52] => 327 [53] => 328 [54] => 336 [55] => 337 [56] => 338 [57] => 346 [58] => 347 [59] => 348) 如果不考虑重复问题,这个不就是排列组合了?1->01232->012343->678总数 = A(4,1)*A(5,1)*A(3,1) = 4*5*3 = 60 代码?echo strlen('0123')*strlen('01234')*strlen('678');//??这个算最快不? <?php$array = array('111','111','11111');//echo strlen($arrar[0]); function zuhe($array){ foreach ($array as $value) { if (strlen($value)) { $sum[] = strlen($value); } } $i = 0; print_r($sum); $total =1; while ($sum[$i]) { $total = $total * $sum[$i]; $i++; } echo $total; }zuhe($array);?> 噢!只要计算组合数啊?!我还以为要求所有的组合呢$ar = array('0123456789', '0123456789', '01234');echo array_product(array_map('strlen', $ar)); 看来我还是要多看PHP手册,又被xu版大人秒杀了。 发现数组中一个奇怪的问题,不知道是不是我写的有问题.$strArr = array( 1 => 0, 3 => 1, 6 => 2, 10 => 3, 15 => 4, 21 => 5, 28 => 6, 36 => 7, 45 => 8, 55 => 9, 63 => 10, 69 => 11, 73 => 12, 75 => 13, 75 => 14, 73 => 15, 69 => 16, 63 => 17, 55 => 18, 45 => 19, 36 => 20, 28 => 21, 21 => 22, 15 => 23, 10 => 24, 6 => 25, 3 => 26, 1 => 27);echo $str = '1,2,3,6,7,25,23,15,18'."\n";$sArr = explode(',',$str);foreach($sArr as $v){ echo array_search($v,$strArr)."\n";}结果:1,2,3,6,7,25,23,15,186157355Array( [1] => 27 [3] => 26 [6] => 25 [10] => 24 [15] => 23 [21] => 22 [28] => 21 [36] => 20 [45] => 19 [55] => 18 [63] => 17 [69] => 16 [73] => 15 [75] => 14)我的0-13的这个怎么都没有了??? 你的 $strArr 数组键名重复了,因此后面的覆盖前面的。print_r($strArr); 就知道了。 $strArr = array( 1 => 0, 3 => 1, 6 => 2, 10 => 3, 15 => 4, 21 => 5, 28 => 6, 36 => 7, 45 => 8, 55 => 9, 63 => 10, 69 => 11, 73 => 12, 75 => 13, 75 => 14, 73 => 15, 69 => 16, 63 => 17, 55 => 18, 45 => 19, 36 => 20, 28 => 21, 21 => 22, 15 => 23, 10 => 24, 6 => 25, 3 => 26, 1 => 27);套红的下标将覆盖上面已有的下标 PHP 怎么将Unicode编码转换为中文字符 php declare()问题 搜索之后仍实现分页的问题 PHP中怎么批量删除数据表中的数据.... 周末永远愉快! 为什么我的PHP加载不了php_bz2.dll文件 PHP无法链接mysql数据 求救能力测试题 怎样使用mysql中的blob型的字段? datagrid 分页 再次封装的控件 要求在xml里面能进行调的 请大牛解决 在线编辑器移到服务器上不显示问题 继续求教正则表达式问题
2->01
3->01重组后的号码为000,001,010,011,总数为4
'0123',
'01234',
'678',
);print_r(foo($ar));
function foo(&$ar, $i=0) {
$res = array();
if($i+1 <count($ar)) {
$t = foo($ar, $i+1);
foreach(str_split($ar[$i]) as $v) {
foreach($t as $r) $res[] = $v . $r;
}
}else $res = str_split($ar[$i]);
return $res;
}Array
(
[0] => 006
[1] => 007
[2] => 008
[3] => 016
[4] => 017
[5] => 018
[6] => 026
[7] => 027
[8] => 028
[9] => 036
[10] => 037
[11] => 038
[12] => 046
[13] => 047
[14] => 048
[15] => 106
[16] => 107
[17] => 108
[18] => 116
[19] => 117
[20] => 118
[21] => 126
[22] => 127
[23] => 128
[24] => 136
[25] => 137
[26] => 138
[27] => 146
[28] => 147
[29] => 148
[30] => 206
[31] => 207
[32] => 208
[33] => 216
[34] => 217
[35] => 218
[36] => 226
[37] => 227
[38] => 228
[39] => 236
[40] => 237
[41] => 238
[42] => 246
[43] => 247
[44] => 248
[45] => 306
[46] => 307
[47] => 308
[48] => 316
[49] => 317
[50] => 318
[51] => 326
[52] => 327
[53] => 328
[54] => 336
[55] => 337
[56] => 338
[57] => 346
[58] => 347
[59] => 348
)
1->0123
2->01234
3->678
总数 = A(4,1)*A(5,1)*A(3,1) = 4*5*3 = 60
//??这个算最快不?
//echo strlen($arrar[0]);
function zuhe($array){
foreach ($array as $value) {
if (strlen($value)) {
$sum[] = strlen($value);
}
} $i = 0;
print_r($sum);
$total =1;
while ($sum[$i]) {
$total = $total * $sum[$i];
$i++;
}
echo $total;
}
zuhe($array);
?>
$ar = array('0123456789', '0123456789', '01234');
echo array_product(array_map('strlen', $ar));
$strArr = array(
1 => 0, 3 => 1, 6 => 2, 10 => 3, 15 => 4, 21 => 5, 28 => 6, 36 => 7, 45 => 8,
55 => 9, 63 => 10, 69 => 11, 73 => 12, 75 => 13, 75 => 14, 73 => 15, 69 => 16,
63 => 17, 55 => 18, 45 => 19, 36 => 20, 28 => 21, 21 => 22, 15 => 23, 10 => 24, 6 => 25,
3 => 26, 1 => 27);echo $str = '1,2,3,6,7,25,23,15,18'."\n";
$sArr = explode(',',$str);
foreach($sArr as $v){
echo array_search($v,$strArr)."\n";
}
结果:1,2,3,6,7,25,23,15,186
15
73
55
Array
(
[1] => 27
[3] => 26
[6] => 25
[10] => 24
[15] => 23
[21] => 22
[28] => 21
[36] => 20
[45] => 19
[55] => 18
[63] => 17
[69] => 16
[73] => 15
[75] => 14
)
我的0-13的这个怎么都没有了???
1 => 0,
3 => 1,
6 => 2,
10 => 3,
15 => 4,
21 => 5,
28 => 6,
36 => 7,
45 => 8,
55 => 9,
63 => 10,
69 => 11,
73 => 12,
75 => 13,
75 => 14,
73 => 15,
69 => 16,
63 => 17,
55 => 18,
45 => 19,
36 => 20,
28 => 21,
21 => 22,
15 => 23,
10 => 24,
6 => 25,
3 => 26,
1 => 27
);
套红的下标将覆盖上面已有的下标