многоуровневое меню из базы данных в codeigniter

У меня есть таблица в моей базе данных, содержащая все мои категории баз данных, которые мне нужно преобразовать в многоуровневое меню. Структура таблицы ниже:

product_category_id | product_category_name | product_category_description | product_category_parent_id -------------------------------------------------------------------------------------------------------- 1 test ulghjbjjjh NULL 2 test2 yruktghkug NULL 3 test sub 1 yr5y346uij 1 4 test sub sub 1 yfghvbnhtd 3 

Используя функции, которые я адаптировал из онлайн-учебника ( здесь ) и часов исследований, полученный код будет отображать только верхний уровень (те, у которых есть родительский идентификатор null). Я уверен, что это проблема с функцией sortMenu, однако я не могу ее обработать.

Вот моя модельная функция, которая извлекает данные:

 public function getProductCategories() { $query = $this->db->get("tbl_product_categories"); return $query->result_array(); } 

Вот контроллер, который вызывает частную функцию от функции индекса, которая, в свою очередь, вызывает частную функцию create_list:

 class products extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model("products_model"); } public function index() { $categories = $this->products_model->getProductCategories(); echo $this->sortMenu($categories); //print_r($this->products_model->getProductCategories()); } private function sortMenu($items) { // create an array to hold the references $refs = array(); // create and array to hold the list $list = array(); // loop over the results //while($data = @mysql_fetch_assoc($result)) foreach($items as $data) { // Assign by reference $thisref = &$refs[ $data['product_category_id'] ]; // add the the menu parent $thisref['product_category_id'] = $data['product_category_parent_id']; $thisref['product_category_title'] = $data['product_category_title']; // if there is no parent id if (is_null($data['product_category_parent_id'])) { $list[ $data['product_category_id'] ] = &$thisref; } else { $refs[ $data['product_category_id'] ]['children'][ $data['product_category_id'] ] = &$thisref; } } print_r($list); return $this->create_list($list); } /** * * Create a HTML list from an array * * @param array $arr * @param string $list_type * @return string * */ private function create_list( $arr ) { $html = "\n<ul>\n"; foreach ($arr as $key=>$v) { $html .= '<li>'.$v['product_category_title']."</li>\n"; if (array_key_exists('children', $v)) { $html .= "<li>"; $html .= create_list($v['children']); $html .= "</li>\n"; } else{} } $html .= "</ul>\n"; return $html; } } 

Это меня полностью сбило с толку: S У кого-нибудь есть идеи?

Из того, что я понимаю,

Эта строка:

 $refs[ $data['product_category_id'] ]['children'][ $data['product_category_id'] ] = &$thisref; 

должно быть следующим:

 $refs[ $data['product_category_parent_id'] ]['children'][ $data['product_category_id'] ] = &$thisref;