把一维关联数组搞成多维树形结构:$tbl = array(   'b4' => 'b2',
                'b1' => '',
                'a2' => 'a1',
                'b2' => 'b1',
                'c1' => '',
                'b3' => 'b2',
                'a3' => 'a1',
                'a1' => ''
);转换成:Array(
        'a1' => Array(
                'a2' => array(),
                'a3' => array()
        ),
        'b1' => Array(
                'b2' => Array(
                        'b3' => Array(),
                        'b4' => Array()
                )
        ),
        'c1' => Array()
)
分不够可以再加。

解决方案 »

  1.   

    咋会这样的奇怪的要求呢
    如下数据不就死循环了?$tbl = array( 'b4'=>'b2',  'b1'=>'b4', 'b2'=>'b1' ); 
      

  2.   

    $tbl = array(   'b4' => 'b2', 
                    'b1' => '', 
                    'a2' => 'a1', 
                    'b2' => 'b1', 
                    'c1' => '', 
                    'b3' => 'b2', 
                    'a3' => 'a1', 
                    'a1' => '' 
    ); 
    foreach($tbl as $k=>$v)
    {
     
      if($v) 
      {
      $o = $v;
      $kkk = '';
      while($o)
      {
      $kkk = "[{$o}]".$kkk;
      $o = $tbl[$o];
      }
      $kkk .= "[{$k}]";
      eval( '!$newArray'.$kkk.' && $newArray'.$kkk.' = array();');
     
      }
      else !$newArray[$k] && $newArray[$k] = array();

    }
    echo "<pre>";
    print_r($newArray);
      

  3.   


    恩,能实现,
    不过不建议用eval,太难看了,error_reporting(E_ALL)的时候会出一大堆Notice,
    我会给你40分的。
    征求更好的方法。
      

  4.   

    <?php
    $tb1=array(  'b4' => 'b2',
                    'b1' => '',
                    'a2' => 'a1',
                    'b2' => 'b1',
                    'c1' => '',
                    'b3' => 'b2',
                    'a3' => 'a1',
                    'a1' => '',
    ); 
    $result=array();
    foreach ($tb1 as $k=>$v)
        if(!$v)
        {
            $result[$k]=array();
        }
    foreach ($result as $firstparent=>$v)
    {
        SearchChildren($result[$firstparent],$firstparent,$tb1,$result);
    }
    print_r($result);
    function SearchChildren(&$parent,$parentname,$arr,&$result)
    {
        $children=array_keys($arr,$parentname);
        $count=count($children);
        if($children) {
            $tmp=array_flip($children);
            foreach ($tmp as &$v)
                $v=array();
            $parent=$tmp;
        }
        else $parent=array();
        foreach ($children as $name=>$secondparent)
            SearchChildren($parent[$secondparent],$secondparent,$arr,$result);
    }
      

  5.   


    $tbl = array(
    'b4' => 'b2',
    'b1' => '',
    'a2' => 'a1',
    'b2' => 'b1',
    'c1' => '',
    'b3' => 'b2',
    'a3' => 'a1',
    'a1' => '',
    'd1' => 'd2',//d1、d2互为上级
    'd2' => 'd1',
    'x2' => 'x1',//x1不存在
    );
    function arrpush(&$out_item,$out_key,$arr){
    if ($out_key == current($arr)) {//找到上级就添加吧
    $out_item[key($arr)] = array();
    } elseif (!empty($out_item)) {//该输出单元有下级的话,看看下级有没有符合的
    array_walk($out_item,__FUNCTION__,$arr);
    }
    }
    $out = array();
    $i=0;
    while($tbl){
    $i++;
    foreach ($tbl as $key => $item) {
    $out_old = $out;
    if (empty($item)) {//单元值为空则直接输出
    $out[$key] = array();
    } elseif (!array_key_exists($item,$tbl)) {//看一下当前单元的上级是否已经输出
    array_walk($out,'arrpush',array($key=>$item));//检测每个输出单元,看看哪个是上级
    if ($out == $out_old) $out[$key] = array();//上级不存在的话作为根节点输出
    } elseif ($i>=10) {//防止死循环,十次循环都没有找到上级的一律直接输出
    $out[$key] = array();
    }
    if ($out != $out_old) unset($tbl[$key]);//每输出一个单元就在原数组中删除一个,直至全部输出
    }
    }
    print_r($out);
      

  6.   

    Thanks guys.        public function parseNodes() {                $retArray = array();                foreach($this->arr_options as $key => $value) {                        $curArr = array();
                            $value = $value['parentName'];
                            if($value) {
                                    $curArr[$key] = array();
                                    while (!empty($value)) {
                                            $curArr = array($value => $curArr);
                                            $value = $this->arr_options[$value]['parentName'];
                                    }
                            } else {
                                    $curArr[$key] = array();
                            }
                            $retArray = array_merge_recursive($retArray, $curArr);
                    }                $this->nodes = $retArray;
                    #print '<pre>';
                    print_r($this->nodes);
                    print_r($this->arr_options);
                    #print '</pre>';
            }