2011-09-27 74 views
0

构建阵列我有一个数组,看起来像这样:递归函数从树

Array (
    [0] => Array 
    (
     [term_id] => 23 
     [name] => testasdf 
     [depth] => 1 
    ) 
    [1] => Array 
    (
     [term_id] => 26 
     [name] => asdf 
     [depth] => 2 
    ) 
    [2] => Array 
    (
     [term_id] => 31 
     [name] => Another level deep 
     [depth] => 3 
    ) 
    [3] => Array 
    (
     [term_id] => 32 
     [name] => Another level deep 
     [depth] => 2 
    ) 
    [4] => Array 
    (
     [term_id] => 24 
     [name] => testasdf 
     [depth] => 1 
    ) 
    [5] => Array 
    (
     [term_id] => 27 
     [name] => asdf 
     [depth] => 1 
    ) 
) 

下面是我使用递归函数,它的作品除了在某些情况下(其中深度大于它似乎

function process(&$arr, &$prev_sub = null, $cur_depth = 1) { 
    $cur_sub = array(); 
    while($line = current($arr)){ 
     if($line['depth'] < $cur_depth){ 
      return $cur_sub; 
     }elseif($line['depth'] > $cur_depth){ 
      $prev_sub = $this->process($arr, $cur_sub, $cur_depth + 1); 
     }else{ 
      $cur_sub[$line['term_id']] = array('term_id' => $line['term_id'], 'name' => $line['name']); 
      $prev_sub =& $cur_sub[$line['term_id']]; 
      next($arr); 
     } 
    } 
    return $cur_sub; 
} 

这是结果怎么样看:

Array 
(
    [23] => Array 
    (
     [26] => Array 
     (
      [31] => Array 
      (
       [term_id] => 31 
       [name] => Another level deep 
      ) 
     ) 
     [32] => Array 
     (
      [term_id] => 32 
      [name] => Another level deep 
     ) 
    ) 
    [24] => Array 
    (
     [term_id] => 24 
     [name] => testasdf 
    ) 
    [27] => Array 
    (
     [term_id] => 27 
     [name] => asdf 
    ) 
) 

任何想法如何,我可以拥有它,因此TE显示所有深度的rm_id和名称?

回答

1

试试这个:

function process(&$arr, &$prev_sub = null, $cur_depth = 1) { 

    $cur_sub = array(); 
    while($line = current($arr)){ 
     if($line['depth'] < $cur_depth){ 
      return $cur_sub; 
     } 
     if($line['depth'] > $cur_depth){ 
      $prev_sub = $this->process($arr, $cur_sub, $cur_depth + 1); 

     } 

      $cur_sub[$line['term_id']] = array('term_id' => $line['term_id'], 'name' => $line['name']); 
      $prev_sub =& $cur_sub[$line['term_id']]; 
      next($arr); 
    } 
    return $cur_sub; 
} 
+0

这实际上匹配了正确的ID,我认为以错误的顺序返回的term_id的面前,但它仍然没有显示term_id和名称值前两个节点,似乎任何有子节点的节点都没有添加term_id和name数组 – dzm