举例:有数字1、2、3、4共4位数字,按两两一组进行无重复组合 / 可重复组合 / 全排列组合,直接保存为PHP文件运行
第一种:无重复排列组合
<?php //无重复排列组合 function getCombinationToString($arr, $m, $push=null) { $rst = array(); for($i = 0; $i < pow(2, count($arr)); $i++) { $a = 0; $b = array(); for($j = 0; $j < count($arr); $j++) { if($i >> $j & 1) { $a++; array_push($b, $arr[$j]); } } if($a == $m) { if(!is_null($push)){ if(is_string($push)){ $b = array_unshift($b, $push); }else{ $b = array_merge($push, $b); } } $rst[] = $b; } } return $rst; } $a = [1,2,3,4]; $b = getCombinationToString($a,2,[]); echo '<pre>'; print_r($b); ?>
打印结果:
Array
(
[0] => Array
(
[0] => 1
[1] => 2
)
[1] => Array
(
[0] => 1
[1] => 3
)
[2] => Array
(
[0] => 2
[1] => 3
)
[3] => Array
(
[0] => 1
[1] => 4
)
[4] => Array
(
[0] => 2
[1] => 4
)
[5] => Array
(
[0] => 3
[1] => 4
)
)
第二种:无重复排列组合
<?php //无重复排列组合 function getCombinationToString2($arr, $m) { $result = array(); if ($m ==1) { return $arr; } if ($m == count($arr)) { $result[] = implode(',' , $arr); return $result; } $temp_firstelement = $arr[0]; unset($arr[0]); $arr = array_values($arr); $temp_list1 = getCombinationToString2($arr, ($m-1)); foreach ($temp_list1 as $s) { $s = $temp_firstelement.','.$s; $result[] = $s; } unset($temp_list1); $temp_list2 = getCombinationToString2($arr, $m); foreach ($temp_list2 as $s) { $result[] = $s; } unset($temp_list2); return $result; } $a = [1,2,3,4]; $b = getCombinationToString2($a,2); echo '<pre>'; print_r($b); ?>
打印结果:
Array
(
[0] => 1,2
[1] => 1,3
[2] => 1,4
[3] => 2,3
[4] => 2,4
[5] => 3,4
)
第三种:无重复排列组合
<?php //可重复排列组合(全组合) function getCombinationToString3($arr, $m) { if ($m ==1) { return $arr; } $result = array(); $tmpArr = $arr; unset($tmpArr[0]); for($i=0;$i<count($arr);$i++) { $s = $arr[$i]; $ret = getCombinationToString3(array_values($tmpArr), ($m-1), $result); foreach($ret as $row) { $result[] = $s . $row; } } return $result; } $arr = array(1,2,3,4); $r = getCombinationToString3($arr, 2); echo '<pre>'; print_r($r); ?>
打印结果:
Array
(
[0] => 12
[1] => 13
[2] => 14
[3] => 22
[4] => 23
[5] => 24
[6] => 32
[7] => 33
[8] => 34
[9] => 42
[10] => 43
[11] => 44
)