Как показать подкатегории выбранной основной категории?

Я пытаюсь создать навигацию, когда пользователь выбирает категорию, тогда навигация будет показывать только подкатегории для выбранной категории.

Я получаю переменную от URL-адреса для передачи в качестве родительского идентификатора, и он выглядит так:

locolhost/store.php?c=2 

навигация, которую я ищу, должна выглядеть так:

 Parent child child Parent Parent Parent 

но, в настоящее время мой код производит:

 Parent child child Parent child child Parent child child Parent child child 

Вот мой текущий код:

shop.php

 $parent_id = $_GET['p']; include('navigation.php'); $navigation = new navigation; print($navigation->main($parent_id)); в $parent_id = $_GET['p']; include('navigation.php'); $navigation = new navigation; print($navigation->main($parent_id)); 

navigation.php

 public function main($parent) { /* PDO */ $array = $categoryVIEW->fetchAll(PDO::FETCH_ASSOC); return $this->buildNav($array,$parent); } private function buildNav($array,$parent) { $html = ''; foreach($array as $item) { if($item['parent'] === NULL) { $html .= "\n<div class=\"parent\"><a href=\"?p=".$item['category_id']."\">".$item['category_name']."</a></div>\n"; $html .= "<div class=\"child\">\n"; $html .= $this->getChildren($array,$parent); $html .= "</div>\n"; } } return $html; } private function getChildren($array,$parent) { $html = ''; foreach($array as $item) { if($item['parent']===$parent) { $html .= "\t<a href=\"?p=".$item['category_id']."\">".$item['category_name']."</a>\n"; } } return $html; } 

Я просто buildNav() вызов getChildren() из buildNav() который получает все дочерние buildNav() для выбранной категории. Я думаю, мне нужно условие, которое вызовет getChildren() только тогда, когда родитель, которого я хочу показать своим детям, проходит через цикл … если это имеет смысл?

Вот моя база данных:

введите описание изображения здесь

Я не думаю, что вы передаете правильную «родительскую» переменную дочерней функции. Попробуйте следующее:

 private function buildNav($array,$parent) { $html = ''; foreach($array as $item) { if($item['parent'] === NULL) { $html .= "\n<div class=\"parent\"><a href=\"?p=".$item['category_id']."\">".$item['category_name']."</a></div>\n"; $html .= "<div class=\"child\">\n"; // the following line needs to be changed $html .= $this->getChildren($array,$item['category_id']); $html .= "</div>\n"; } } return $html; } 

Я понял это … Мне нужно было добавить условие. Вот рабочий код:

 private function buildNav($array,$parent) { $html = ''; foreach($array as $item) { if($item['parent'] === NULL) { $html .= "\n<div class=\"parent\"><a href=\"?p=".$item['category_id']."\">".$item['category_name']."</a></div>\n"; $html .= "<div class=\"child\">\n"; /* had to add this condition */ if($item['category_id'] === $parent) { $html .= $this->getChildren($array,$parent); } $html .= "</div>\n"; } } return $html; } private function getChildren($array,$parent) { $html = ''; foreach($array as $item) { if($item['parent'] === $parent) { $html .= "\t<a href=\"?p=".$item['category_id']."\">".$item['category_name']."</a>\n"; } } return $html; }