使用递归函数用类别和子类别填充数组

using recursive function to populate an array with category and sub categories

我像这样将我的类别和子类别存储在同一个 table 中,每个类别或子类别可能有自己的子类别

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

我想将所有猫和子类别存储在一个数组中,以保持它们的 parent-child 关系

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

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 ;
}

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

http://jsfiddle.net/nkxgc4by/

当 $childs 为真时,你需要 return 你的 $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 );

那你的孩子也有同样的结构