Search code examples
phpmysqlcodeigniterpyrocms

Recursive table which child parent relationship


I have a problem with a recursive function that takes too many resources to display a child-parent relation in a dropdown list. For example:

home
-menu 1
-menu 2
home 1
-menu 3
-menu 4

I've written some code for a recursive call to the database each time, so that's the reason why my code takes so many resources to run.

Below is my code:

--call recursive

$tmp = $this->get_nav_by_parent(0);
$a_sel = array('' => '-Select-');
$a_sel_cat = array('home' => 'home');
$this->get_child_nav_cat($tmp, 0, $a_sel);

--

public function get_nav_by_parent($parent) {
        $all_nav = $this->db
                ->select('id, title, parent')
                ->where('parent',$parent)
                ->order_by('position')
                ->get('navigation_links')
                ->result_array();

        $a_tmp = array();
        foreach($all_nav as $item)
        {
            if($parent != 0){
               $item['title'] = '--' . $item['title'];
            }
            $a_tmp[] = $item;
        }
        return $a_tmp;
    }

-- Recursive function

    public function get_child_nav_cat($a_data, $parent, &$a_sel) {

        foreach($a_data as $item) {
            $a_sel[$item['page_slug_key']] = $item['title'];
            $atmp = $this->get_nav_by_parent($item['id']);
            $this->get_child_nav_cat($atmp, $item['id'], $a_sel);         
        }
       return $a_sel;
   }

Please give me suggestions for the best solution to display the data as child-parent relationship in select box. Thanks in advance!


Solution

  • Best way to display parent child relationship is mentain parent and child flag in Database instead of fetching value using loop.

    In your case Home, Home 1 is parent flag and menus belong on child flag.

    fetch data from db and your loop look like this:-

    $arr = array(0 => array('name' => 'home','parent' => 0),
      1 => array('name' => 'menu 1 ','parent' => 1),
      2 => array('name' => 'menu 2 ','parent' => 1),
      3 => array('name' => 'home 1','parent' => 0),
      4 => array('name' => 'menu 3 ','parent' => 2),
      5 => array('name' => 'menu 4','parent' => 2)
      );
    
      $dd_html = '<select>';
      foreach($arr as $k => $v){
            if($v['parent'] == 0 )
               $dd_html .='<option>'.$v['name'].'</option>';
             else 
               $dd_html .='<option>--'.$v['name'].'</option>';
      }
    
      $dd_html .= '</select>';
    
      echo $dd_html;  
    

    Output :-

    home
    -menu 1
    -menu 2
    home 1
    -menu 3
    -menu 4