php排列组合的算法。
<?php $keyword_list = ['mysql', '数据库', '权限']; //求2个元素作为一个整体的排列数组 $list = arrangement($keyword_list, 2); echo '<pre>'; print_r($list); //求2个元素作为一个整体的排列数组个数 $num = arrangementNum(count($keyword_list), 2); echo $num . "\n"; //求2个元素作为一个整体的组合数组 $list = combination($keyword_list, 2); echo '<pre>'; print_r($list); //求2个元素作为一个整体的组合数组个数 $num = combinationNum(count($keyword_list), 2); echo $num . "\n";
// 阶乘 function factorial($n) { return array_product(range(1, $n)); } // 排列数 function arrangementNum($n, $m) { return factorial($n) / factorial($n - $m); } // 组合数 function combinationNum($n, $m) { return arrangementNum($n, $m) / factorial($m); }
// 排列 function arrangement($array, $m) { $r = array(); $n = count($array); if ($m <= 0 || $m > $n) { return $r; } for ($i = 0; $i < $n; $i++) { $b = $array; $t = array_splice($b, $i, 1); if ($m == 1) { $r[] = $t; } else { $c = arrangement($b, $m - 1); foreach ($c as $v) { $r[] = array_merge($t, $v); } } } return $r; }
// 组合 function combination($array, $m) { $r = array(); $n = count($array); if ($m <= 0 || $m > $n) { return $r; } for ($i = 0; $i < $n; $i++) { $t = array($array[$i]); if ($m == 1) { $r[] = $t; } else { $b = array_slice($array, $i + 1); $c = combination($b, $m - 1); foreach ($c as $v) { $r[] = array_merge($t, $v); } } } return $r; }
关于排列更高效的算法方法
function arrangementV2($array, $num) { $result = []; if ($num == 1) { foreach ($array as $key => $value) { $result[] = [$key => $value]; } return $result; } ksort($array); $subArray = array_slice($array, 1, null, true); $subArrayResult = arrangementV2($subArray, $num - 1); foreach ($array as $key => $value) { foreach ($subArrayResult as $v1) { $ext = array_keys($v1); if ($key < array_shift($ext)) { $result[] = [$key => $value] + $v1; } } } return $result; }