21,887
社区成员
发帖
与我相关
我的任务
分享
/**
参数:
$arr:原始Array
$len:组合后的长度
/**/
Function getArray($arr,$len){
//请帮忙写
}
$arr=Array('A','B','C');
print_r(getArray($arr,2));
$arr=Array('A','B','C','D','E','F');
print_r(getArray($arr,4));
function combination($ar, $num) {
$control = range(0, $num-1);
$k = false;
$total = count($ar);
while($control[0] < $total-($num-1)) {
$t = array();
for($i=0; $i<$num; $i++) $t[] = $ar[$control[$i]];
$r[] = $t;
for($i=$num-1; $i>=0; $i--) {
$control[$i]++;
for($j=$i; $j<$num-1; $j++) $control[$j+1] = $control[$j]+1;
if($control[$i] < $total-($num-$i-1)) break;
}
}
return $r;
}
function combination($ar, $k, $m=0, $a=array()) {
static $ret = array();
if($m == 0) {
$m = count($ar);
$ret = array();
}
for($i=$m; $i>=$k; $i--) {
$a[$k-1] = $ar[$i-1];
if($k > 1) {
combination(&$ar, $k-1, $i-1, $a);
}else {
array_unshift ($ret, array_reverse($a));
}
}
return $ret;
}
利用堆栈的写法function combination($ar, $num) {
$control = range(0, $num-1);
$k = false;
$total = count($ar);
while($control[0] < $total-($num-1)) {
$t = array();
for($i=0; $i<$num; $i++) $t[] = $ar[$control[$i]];
$r[] = $t;
for($i=$num-1; $i>=0; $i--) {
$control[$i]++;
for($j=$i; $j<$num-1; $j++) $control[$j+1] = $control[$j]+1;
if($control[$i] < $total-($num-$i-1)) break;
}
}
return $r;
}
function combination( $arr, $num=0) {
$len = count($arr);
if($num == 0) $num = $len;
$res = array();
for($i=1,$n=pow(2, $len);$i<$n;++$i) {
$tmp = str_pad(base_convert($i, 10, 2), $len, '0', STR_PAD_LEFT);
$t = array();
for($j=0;$j<$len;++$j) {
if($tmp{$j} == '1') {
$t[] = $arr[$j];
}
}
if(count($t) == $num) $res[] = join('', $t);
}
return $res;
}
调用:
$arr = array('A', 'B', 'C');
print_r(combination($arr, 2));
Array
(
[0] => BC
[1] => AC
[2] => AB
)
/*
$arr = array("A","B","C");
Function getArray($arr,$len=2){
$arr2 = array();
foreach ($arr as $y){
foreach($arr as $k){
if($y != $k){
$arr2[] = $y.$k;
}
}
}
$arr3 = array();
foreach($arr2 as $c){
$f = str_split($c);
if($arr3){
$i = 0;
foreach($arr3 as $d){
$e = str_split($d);
if(in_array($f[0],$e) && in_array($f[1],$e)){
$i++;
}
}
if(!$i){
$arr3[] = $c;
}
}else{
$arr3[] = $c;
}
}
return $arr3;
}*/
$arr = array("A","B","C","D");
Function getArray($arr,$len=3){
$arr2 = array();
foreach ($arr as $y){ //$len是几,就循环几次,这里是一个变数
foreach($arr as $k){
foreach($arr as $v){
if($y != $k && $y != $v && $v != $k){ //$len个元素均不相同
$arr2[] = $y.$k.$v;
}
}
}
}
$arr3 = array();
foreach($arr2 as $c){
$f = str_split($c);
if($arr3){
$i = 0;
foreach($arr3 as $d){
$e = str_split($d);
if(in_array($f[0],$e) && in_array($f[1],$e) && in_array($f[2],$e)){ //$len个元素都在数组中的话,$i++ 如果$i大于0,这个记录就抛弃
$i++;
}
}
if(!$i){
$arr3[] = $c;
}
}else{
$arr3[] = $c;
}
}
return $arr3;
}
print_r(getArray($arr));
有三处会根据$len变化,而ABCD四个字符或者ABCDE五个字符均可正确得出结果
所以关键在$len这里如何判断和递归...
==============================
总觉得这个方法很山寨,求批评指正