Я пытаюсь создать навигацию, когда пользователь выбирает категорию, тогда навигация будет показывать только подкатегории для выбранной категории.
Я получаю переменную от 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; }