高分求助一个数据打印出如下效果,请给指点一下思路

        $cata = array();
$cata[0] = 'a_aa_aaa_5';
$cata[1] = 'a_aa_aab_2';
$cata[2] = 'a_aa_aac_2';
$cata[3] = 'a_ab_abb_1';
$cata[4] = 'a_ab_abc_2';
$cata[5] = 'b_ba_baa_9';
$cata[6] = 'b_ba_bab_2';
$cata[7] = 'b_bb_bbb_3';
$cata[8] = 'c_ca_cab_2';
$cata[9] = 'c_ca_caa_3';
$cata[10] = 'c_ca_cac_4';
/*
a (12)
aa(9)
aaa(5)
aab(2)
aac(2)
ab(3)
abf(1)
abc(2)
b(14)
ba(11)
ba(9)
ba(2)
bb(3)
bbb(3)
c(9)
ca(9)
cab(2)
caa(3)
cac(4)*/

解决方案 »

  1.   

    a (12)=9+3
        aa(9)=5+2+2
            aaa(5)
            aab(2)
            aac(2)
        ab(3)=1+2
            abf(1)
            abc(2)
    //
    汗,这个还有点复杂
      

  2.   

    还好。
    $cata = array();
        $cata[0] = 'a_aa_aaa_5';
        $cata[1] = 'a_aa_aab_2';
        $cata[2] = 'a_aa_aac_2';
        $cata[3] = 'a_ab_abb_1';
        $cata[4] = 'a_ab_abc_2';
        $cata[5] = 'b_ba_baa_9';
        $cata[6] = 'b_ba_bab_2';
        $cata[7] = 'b_bb_bbb_3';
        $cata[8] = 'c_ca_cab_2';
        $cata[9] = 'c_ca_caa_3';
        $cata[10] = 'c_ca_cac_4';
    $printarr=array();
    foreach($cata as $item){
    $itemarr=explode("_",$item);
    $printarr[$itemarr[0]][$itemarr[1]][$itemarr[2]]=$itemarr[3];
    }
    echo vvar_export($printarr,0);function vvar_export($array,$c=1,$t='',$var=''){
    $c && $var="array(\r\n";
    $t.="  ";
    if(is_array($array)){
    foreach($array as $key => $value){
    $var.="$t".addslashes($key)."";
    if(is_array($value)){
    $var.="(".get_array_sum($value).")\r\n";
    $var=vvar_export($value,0,$t,$var);
    $var.="$t\r\n";
    } else{
    $value=addslashes($value);
    $value=str_replace("\'","'",$value);
    $var.="(".($value)."),\r\n";
    }
    }
    }
    if($c){
    $var.=")";
    }
    return $var;
    }
    function get_array_sum($array){
    $var=0;
    if(is_array($array)){
    foreach($array as $value){
    if(is_array($value)){
    $var+=get_array_sum($value);
    } else{
    $var+=intval($value);
    }
    }
    }else{
    $var+=intval($array);
    }
    return $var;
    }
      

  3.   

    上面的结尾多输出了逗号和空格
    $cata = array();
        $cata[0] = 'a_aa_aaa_5';
        $cata[1] = 'a_aa_aab_2';
        $cata[2] = 'a_aa_aac_2';
        $cata[3] = 'a_ab_abb_1';
        $cata[4] = 'a_ab_abc_2';
        $cata[5] = 'b_ba_baa_9';
        $cata[6] = 'b_ba_bab_2';
        $cata[7] = 'b_bb_bbb_3';
        $cata[8] = 'c_ca_cab_2';
        $cata[9] = 'c_ca_caa_3';
        $cata[10] = 'c_ca_cac_4';
    $printarr=array();
    foreach($cata as $item){
    $itemarr=explode("_",$item);
    $printarr[$itemarr[0]][$itemarr[1]][$itemarr[2]]=$itemarr[3];
    }
    echo "<pre>";
    echo vvar_export($printarr,0);function vvar_export($array,$c=1,$t='',$var=''){
    $c && $var="array(\r\n";
    $t.="  ";
    if(is_array($array)){
    foreach($array as $key => $value){
    $var.="$t".addslashes($key)."";
    if(is_array($value)){
    $var.="(".get_array_sum($value).")\r\n";
    $var=vvar_export($value,0,$t,$var);
    } else{
    $value=addslashes($value);
    $value=str_replace("\'","'",$value);
    $var.="(".($value).")\r\n";
    }
    }
    }
    if($c){
    $var.=")";
    }
    return $var;
    }
    function get_array_sum($array){
    $var=0;
    if(is_array($array)){
    foreach($array as $value){
    if(is_array($value)){
    $var+=get_array_sum($value);
    } else{
    $var+=intval($value);
    }
    }
    }else{
    $var+=intval($array);
    }
    return $var;
    }
      

  4.   

    $cata = array();
        $cata[0] = 'a_aa_aaa_5';
        $cata[1] = 'a_aa_aab_2';
        $cata[2] = 'a_aa_aac_2';
        $cata[3] = 'a_ab_abb_1';
        $cata[4] = 'a_ab_abc_2';
        $cata[5] = 'b_ba_baa_9';
        $cata[6] = 'b_ba_bab_2';
        $cata[7] = 'b_bb_bbb_3';
        $cata[8] = 'c_ca_cab_2';
        $cata[9] = 'c_ca_caa_3';
        $cata[10] = 'c_ca_cac_4';foreach($cata as $v) {
      list($a, $b, $c, $d) = split('_', $v);
      $r[$a][$b][$c] = $d;
    }function sum($a, &$r) {
      foreach($a as $k=>$b) {
        if(is_array($b)) {
          $r[$k] = array_merge(array('__num' => 0), $b);
          $a[$k] = sum($b, $r[$k]);
          $r[$k]['__num'] = $a[$k];
        }
      }
      return array_sum($a);
    }
    $ret = array();
    echo sum($r, $ret);print_r($ret);Array
    (
        [a] => Array
            (
                [__num] => 12
                [aa] => Array
                    (
                        [__num] => 9
                        [aaa] => 5
                        [aab] => 2
                        [aac] => 2
                    )            [ab] => Array
                    (
                        [__num] => 3
                        [abb] => 1
                        [abc] => 2
                    )        )    [b] => Array
            (
                [__num] => 14
                [ba] => Array
                    (
                        [__num] => 11
                        [baa] => 9
                        [bab] => 2
                    )            [bb] => Array
                    (
                        [__num] => 3
                        [bbb] => 3
                    )        )    [c] => Array
            (
                [__num] => 9
                [ca] => Array
                    (
                        [__num] => 9
                        [cab] => 2
                        [caa] => 3
                        [cac] => 4
                    )        ))
      

  5.   

    谢谢楼上,能否解释一下算法啊。
    看不太懂。
    为什么注释掉 //echo sum($r, $ret);
    这句话打印出的数组就为空了?
      

  6.   

    因为他顺便执行了下sum($r, $ret);
    不执行当然没有结果了。
      

  7.   

    谢谢各位,出来的数组能否foreach成如下效果。
    因为存成数组的目的就是要在模板中渲染成如下的效果。
    /*
    a (12)
        aa(9)
            aaa(5)
            aab(2)
            aac(2)
        ab(3)
            abf(1)
            abc(2)
    b(14)
        ba(11)
            ba(9)
            ba(2)
        bb(3)
            bbb(3)
    c(9)
        ca(9)
            cab(2)
            caa(3)
            cac(4)*/
      

  8.   

    能否去掉'__num'这个键。得到这样的如下数组也可以:Array
    (
        [a] => Array
            (
                [aa] => Array
                    (
                        [aaa] => 5
                        [aab] => 2
                        [aac] => 2
                    )            [ab] => Array
                    (
                        [abf] => 1
                        [abc] => 2
                    )        )    [b] => Array
            (
                [ba] => Array
                    (
                        [baa] => 9
                        [bab] => 2
                    )            [bb] => Array
                    (
                        [bbb] => 3
                    )        ))
      

  9.   

    $cata = array();
        $cata[0] = 'a_aa_aaa_5';
        $cata[1] = 'a_aa_aab_2';
        $cata[2] = 'a_aa_aac_2';
        $cata[3] = 'a_ab_abb_1';
        $cata[4] = 'a_ab_abc_2';
        $cata[5] = 'b_ba_baa_9';
        $cata[6] = 'b_ba_bab_2';
        $cata[7] = 'b_bb_bbb_3';
        $cata[8] = 'c_ca_cab_2';
        $cata[9] = 'c_ca_caa_3';
        $cata[10] = 'c_ca_cac_4';foreach($cata as $v) {
      list($a, $b, $c, $d) = split('_', $v);
      $r[$a][$b][$c] = $d;
    }
    print_r($r);