实现数字的排列组合
一、需求
例1 现有0,1,2,3四个数字要实现从000~333之间的组合
此组合共有4*4*4=64种
例2 现有1,2,3,4,5五个数字要实现11111~55555之间的组合
二、实现
下面的方法都可以实现上述类似的需求
/**
* Note:实现从$start到$end长度$len的不重复的数字
* @param int $start 开始数字
* @param int $end 结束数字
* @param int $len 长度
* @param int $num 当前数字初始值等于0
* @param int $digit 当前数字位数初始值等于$len
* @return array
*/
function generateNumbers($start,$end,$len,$num,$digit) {
if ($digit == 0) {
return [str_pad($num, $len, '0', STR_PAD_LEFT)];
}
$result = [];
for ($i = $start; $i <= $end; $i++) {
$result = array_merge($result, $this->generateNumbers($start,$end,$len,$num * 10 + $i, $digit - 1));
}
return $result;
}
三、结果
Array
(
[0] => 000
[1] => 001
[2] => 002
[3] => 003
[4] => 010
[5] => 011
[6] => 012
[7] => 013
[8] => 020
[9] => 021
[10] => 022
[11] => 023
[12] => 030
[13] => 031
[14] => 032
[15] => 033
[16] => 100
[17] => 101
[18] => 102
[19] => 103
[20] => 110
[21] => 111
[22] => 112
[23] => 113
[24] => 120
[25] => 121
[26] => 122
[27] => 123
[28] => 130
[29] => 131
[30] => 132
[31] => 133
[32] => 200
[33] => 201
[34] => 202
[35] => 203
[36] => 210
[37] => 211
[38] => 212
[39] => 213
[40] => 220
[41] => 221
[42] => 222
[43] => 223
[44] => 230
[45] => 231
[46] => 232
[47] => 233
[48] => 300
[49] => 301
[50] => 302
[51] => 303
[52] => 310
[53] => 311
[54] => 312
[55] => 313
[56] => 320
[57] => 321
[58] => 322
[59] => 323
[60] => 330
[61] => 331
[62] => 332
[63] => 333
)