PHP 实现字符串的所有排列

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Test{

/**
* arr 元素数组,
* m 从arr 中选择的元素个数
* isRepeat arr中的元素是否可以重复
* isSortRepeat arr中的元素排序后是否可以重复
* b 中间变量
* M 等于第一次调用时的 m
* res 存放结果
*/
public static function combine($arr, $m, $isRepeat = 0, $isSortRepeat = 0, $b = [], $n = 0, $res = []) {
!$n && $n = $m;

if($m == 1) {
foreach($arr as $item)
$res[] = array_merge($b, [$item]);
} else {
foreach($arr as $key => $item) {
$b[$n - $m] = $item;

$tmp = $arr;
if(!$isRepeat) unset($tmp[$key]);

$res = self::combine($tmp, $m-1, $isRepeat, $b, $n, $res);
}
}

if($isSortRepeat){
foreach ($res as $key => $value) {
asort($value);
$res[$key] = $value;
}
$unique_arr = [];
foreach ($res as $key => $value) {
$unique_arr[] = implode(',',$value);
}
$unique_arr = array_unique($unique_arr);
$unique_key = array_keys($unique_arr);
foreach ($res as $key => $value) {
if(!in_array($key,$unique_key)){
unset($res[$key]);
}
}
}

return $res;

}

print_r(Test::combine(['a','b', 'c'], 3));
-------------本文结束感谢您的阅读-------------
0%