希望社区大神能给优化,或者能给出一个更好的解决问题的方法 [ 求助交流 ]
需求 : 将数组$arr=array('A','B','C','D');
中的 字母的所有组合列出 并 自然顺序 先排一个字母的然后是两个字母的以此类推。
代码如下
$arr=array('A','B','C','D');
function rand_S($arr){
$num = count($arr);
$total = pow(2, $num);
$m=null;
//循环出所有组合
for ($i = 0; $i < $total; $i++) {
for ($j = 0; $j < $num; $j++) {
if (pow(2, $j) & $i)$m.=$arr[$j];
}
if($m)$letter[]=$m;
$m=null;
}
sort($letter);
//重构二维数组 组合位数等于k的
for($k=1;$k<$num+1;$k++){
foreach ($letter as $lkey=>$lval){
if($k == strlen($lval)){
$new[$k][$lkey]=$lval;
}
}
}
//降维
foreach ($new as $val){
foreach($val as $vval){
$result[]=$vval;
}
}
return $result;
}
echo '<pre>';print_r(rand_S($arr));
exit;
结果如下:
Array
(
[0] => A
[1] => B
[2] => C
[3] => D
[4] => AB
[5] => AC
[6] => AD
[7] => BC
[8] => BD
[9] => CD
[10] => ABC
[11] => ABD
[12] => ACD
[13] => BCD
[14] => ABCD
)
共 3 条回复
-
$old_array = $new_array[] = $ab_array = ['A','B','C','D','E','F']; function makeAb($old_array,$new_array,&$ab_array,$num=1) { $flip=array_flip($old_array); $old_num=count($old_array); foreach ($old_array as $key => $value ) { foreach ($new_array[$num-1] as $value_n) { if ($key < $flip[$value_n[0]] ) { $ab_array[] = $new_array[$num][] = $value.$value_n; } } } $num++; if ($num < $old_num ) { makeAb($old_array,$new_array,$ab_array,$num); } } makeAb($old_array,$new_array,$ab_array,1); var_dump($ab_array);
共 1 条回复内蒙之家 觉得很赞
红鲤鱼与绿鲤鱼与驴 北京
注册时间:2015-08-14
最后登录:2022-10-17
在线时长:4538小时14分
最后登录:2022-10-17
在线时长:4538小时14分
- 粉丝30
- 金钱21940
- 威望40
- 积分67720