红鲤鱼与绿鲤鱼与驴 2016-09-28 19:53:24 2233次浏览 3条回复 0 0 0

需求 : 将数组$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
)
  • 回复于 2016-09-29 19:38 举报

    看不懂啊我

    1 条回复
    回复于 2016-09-30 09:00 回复

    没明白需求?

  • 回复于 2016-09-30 15:58 举报

    你这个有点类似拍簧片的分词啊

    2 条回复
    回复于 2016-09-30 16:12 回复

    没懂 ,什么意思?

    回复于 2016-09-30 16:49 回复

    这个功能有点想分词啊

  • 回复于 2016-10-04 08:51 举报
    $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 条回复
    回复于 2016-10-13 10:32 回复

    这个递归写的好

    觉得很赞
您需要登录后才可以回复。登录 | 立即注册