PHP做排列组合,递归形式
$arr = array('a', 'b', 'c', 'd','e');
combine_array($arr);
function combine_array($arr, $index=0) {
static $num = 0;
$arr_len = count($arr);
if($arr_len == $index) {
++$num;
//输出每个结果
echo $num.' '. join(",", $arr) . '<br/>';
} else {
for($i=$index; $i<$arr_len; $i++) {
list($arr[$index], $arr[$i]) = array($arr[$i], $arr[$index]);
combine_array($arr, $index+1);
list($arr[$index], $arr[$i]) = array($arr[$i], $arr[$index]);
}
}
}
输出结果如下:
1 a,b,c,d,e<br/>
2 a,b,c,e,d<br/>
3 a,b,d,c,e<br/>
4 a,b,d,e,c<br/>
5 a,b,e,d,c<br/>
6 a,b,e,c,d<br/>
7 a,c,b,d,e<br/>
8 a,c,b,e,d<br/>
9 a,c,d,b,e<br/>
10 a,c,d,e,b<br/>
11 a,c,e,d,b<br/>
12 a,c,e,b,d<br/>
13 a,d,c,b,e<br/>
...... 下面太长了,省略掉
输出指定的排列数
/**
* @param $arr 递归数组
* @param int $index 索引
* @param $res 输出第几个数
* @return bool
*/
function combine_array($arr, $index=0,$res) {
static $num = 0;
$arr_len = count($arr);
if($arr_len == $index) {
++$num;
if (($num-1)==$res){
return $arr;
}else{
return false;
}
} else {
for($i=$index; $i<$arr_len; $i++) {
list($arr[$index], $arr[$i]) = array($arr[$i], $arr[$index]);
$res_com = combine_array($arr, $index+1,$res);
if ($res_com){
return $res_com;
}
list($arr[$index], $arr[$i]) = array($arr[$i], $arr[$index]);
}
}
}
$arr = [0,1,2,3];
//输出key为 18 的组合
$arr_list = combine_array($arr,0,18);