使用递归函数来填充具有类别和子类别的数组

时间:2015-01-12 23:16:14

标签: php recursion

我将我的类别和子类别存储在同一个表中,每个类别或子类别可能都有自己的子类别

+--------+---------------+---------------+
| id     | title         | parent        |
+--------+---------------+---------------+
|      1 | black         |             0 | 
|      2 | red           |             0 | 
|      3 | dark red      |             2 | 
|      4 | light red     |             2 | 
|      5 | very light red|             4 | 
+--------+---------------+---------------+

我想以一种保持父子关系的方式将所有cat和sub类别存储在数组中

所以我认为递归函数是干净的方式,所以这里是我想出的最好的

function get_categories(){

    $array  =  array();
    $all    = $this->db->get('category' , array('parent'=>0) ); 
   // this query gets all the parent categories ( select * where parent = 0 )

    foreach($all as $a )
    {
        $array[$a->id]['category'] =  $a->title ;
        $array[$a->id]['childs']   = $this->childs( $a->id );
    }

    echo '<pre>';print_r($array); echo '</pre>';

}


 // my recursive function
function childs($parent_id = 0 , $arr = array()){

    $childs =  $this->db->get('category' , array('parent'=>$parent_id ) );
    //  this query :  select * where parent = $parent_id 

    if($childs)
    {
      foreach($childs as $ch)
      {
         $arr[$ch->id][ 'category' ] = $ch->title;
         $arr[$ch->id][ 'childs' ] = $this->childs($ch->id , $arr );
      }
    }


    return $arr ;
}

但即使没有孩子,我也会为每个类别获得额外的孩子!  这是jsfiddle的结果(An !!!:

http://jsfiddle.net/nkxgc4by/

1 个答案:

答案 0 :(得分:0)

当$ childs为true时,你需要返回$ arr;)

       }

       return $arr;

只删除你的其他人。

对于你的结构:

      $arr[$parent_id] = $ch->title;
      $this->childs($ch->id , $arr );

替换为

      $arr[$ch->id][ 'category' ] = $ch->title;
      $arr[$ch->id][ 'childs' ] = $this->childs( $ch->id );

然后你的孩子有相同的结构