有一个字符数组,数组元素各不重复,例如 $char = array('a','b','c','d','e');如何求出该数组的所有子数组,子数组的定义是各种可能的元素组合,例如{'a'},{'b'},{'c'},{'a','b'}........个人的想法是,用一个n位的二进制表示各元素的状态,例如对于10101表示a,c,e在子数组中,而d,b不在数组中。这样的话只需要1-2^n循环,就能求出所有的子数组。大致写了下代码,不知道有没有更好的算法。请指教。<?php
   $arr = array('a','b','c','d','e');
   $result = array();
   for($i = 1;$i<pow(2,count($arr));$i++){
     $t = array();
     $numcode = sprintf("%05s",decbin($i));
 echo $numcode."<br/>";
     for($j = 0;$j<strlen($numcode);$j++){
   if($numcode{$j} == '1'){
     $t[] = $arr[$j];
   }
 }
$result[] = $t; 
   }
   echo "<pre>";
   print_r($result);
   echo "</pre>";

解决方案 »

  1.   

    上面的%5s错误,应该是%{$count}s count是数组元素个数。
      

  2.   

    以下是收藏头一阵子徐老大所回答的一个人的问题答案:
    //获取组合的个数
    function composeList($from = array(), $num = 0, $to = array()){
    global $ar;
    if(($count = count($to)) == $num){
    $ar[] = implode('', $to);
    return ;
    }
    if($num < 0 || ($count == 0 && count($from) < $num)){
    echo    'Err';
    return ;
    }
    foreach($from AS $k => $v){
    $to[]    = $v;
    unset($from[$k]);
    composeList($from, $num, $to);
    array_pop($to);
    }
    }$arr = str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    $ar = array();
    composeList($arr, 4);
    echo '<pre>';print_r($ar);