Intereting Posts
Как использовать настраиваемое поле для добавления класса в сообщение? Почему состояние флажка не всегда передается скрипту PHP? Используйте Require_once () для правильного включения переменных подключения базы данных Использование длинного опроса ajax для обновления ответа на моей странице с внешнего API Используйте API Google AdWords с PHP, чтобы получить ключевое слово CPC и ежемесячный объем поиска Когда следует использовать скобки в операторах require / include? Выдача запроса FORM POST с PHP с использованием базовой аутентификации HTTP Лучший / простой способ анализа параметров конфигурации в Sh / Bash и php Сохранить полную веб-страницу textarea устанавливает высоту на основе содержимого js или jquery Преобразование всех HTML-тегов в нижний регистр. Простое имя учетной записи SPA, сохраненное как «root» вместо заданного имени пользователя php, pdo mysql не может вставляться с внутренним соединением Новая установка Symfony 3: не удалось открыть входной файл: приложение / консоль в установке композитора Ассоциация Doctrine 2 без ограничений внешнего ключа

Использование рекурсии для создания навигации

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

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

Я прочитал несколько ссылок о том, как работает рекурсия, и я должен быть медленным, потому что мне трудно понять. Я пытался что-то написать, и я знаю, что он даже не близок к тому, что мне действительно нужно, но это начало:

PDO

public function viewCategories() { $viewSQL = "SELECT * FROM categories"; try { $pdo = new PDO('mysql:host=localhost;dbname=store','root',''); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $categoryVIEW = $pdo->prepare($viewSQL); $categoryVIEW->execute(); $array = $categoryVIEW->fetchAll(PDO::FETCH_ASSOC); $categoryVIEW->closeCursor(); $json = json_encode($array); return $json; } catch(PDOexception $e) { return $e->getMessage(); exit(); } } 

Рекурсия

 $return = json_decode($category->viewCategories(),true); function buildNavigation($json) { foreach($json as $item) { if($item['category_id'] === $item['parent']) { print('<li>'.$item['category_name'].'</li>'); if($item['category_id'] === $item['parent']) { print('<li>match'.$item['category_name'].'</li>'); buildNavigation($json); } } } buildNavigation($return); 

как и ожидалось, это никогда не вступит в состояние. Я попытался понять это самостоятельно, потому что это хорошая вещь, чтобы знать, но я думаю, что это выходит за рамки моей умственной способности 🙁

Спасибо, что посмотрели 🙂

ОБНОВИТЬ

Я знаю, что на это уже был дан ответ, но есть ли способ сделать это для создания ассоциативного массива? Я играл с функцией, которая ALMOST работает для меня, что я получил от ЗДЕСЬ , но она добавляет дополнительный массив, который я НЕ хочу.

метод

 private function buildCategories($array,$parent) { $result = array(); foreach($array as $row) { if($row['parent'] == $parent) { $result[$row['category_name']] = $this->buildCategories($array,$row['category_id']); } } return $result; } $json = json_encode($this->buildCategories($array,NULL)); return $json; 

Я хочу это:

 {"reloading":{"components","presses and dies","tumblers & scales","tools & accessories","shotshell reloading"} 

но я получаю следующее:

 {"reloading":{"components":[],"presses and dies":[],"tumblers & scales":[],"tools & accessories":[],"shotshell reloading":[]} 

Вот пример с рекурсией.

 function buildNavigation($items, $parent = NULL) { $hasChildren = false; $outputHtml = '<ul>%s</ul>'; $childrenHtml = ''; foreach($items as $item) { if ($item['parent'] == $parent) { $hasChildren = true; $childrenHtml .= '<li>'.$item['category_name']; $childrenHtml .= buildNavigation($items, $item['category_id']); $childrenHtml .= '</li>'; } } // Without children, we do not need the <ul> tag. if (!$hasChildren) { $outputHtml = ''; } // Returns the HTML return sprintf($outputHtml, $childrenHtml); } print buildNavigation($items); 

Этот скрипт создает следующий результат:

 <ul> <li>Menu 1</li> <li>Menu 2 <ul> <li>Sub Menu 2.1</li> <li>Sub Menu 2.2</li> <li>Sub Menu 2.3 <ul> <li>Sub Menu 2.2.1</li> <li>Sub Menu 2.2.2</li> <li>Sub Menu 2.2.3</li> </ul> </li> </ul> </li> <li>Menu 3</li> </ul> 

У меня такой же код выше, с небольшим изменением, так что пользователь может применять разные css на каждом уровне меню, теперь он показывает классы подменю, такие как child-class1, когда он находится в первом подменю, и он покажет child-class2 когда его во втором подменю и так далее …

  <?php function buildNavigation($items, $parent = NULL, $n=NULL) { $hasChildren = false; if ($parent == NULL) { $level=0; $outputHtml = '<ul class="parent-class">%s</ul>'; } else { if($n==NULL) { $level=1; } else { $level=$n; } $outputHtml = '<ul class="child-class'.$level.'">%s</ul>'; } $childrenHtml = ''; foreach($items as $item) { if ($item['parent'] == $parent) { $hasChildren = true; $childrenHtml .= '<li><a href="/'.$item['slug'].'">'.$item['ptitle'].'</a>'; $next = ++$level; $childrenHtml .= buildNavigation($items, $item['pageid'],$next); $childrenHtml .= '</li>'; } } // Without children, we do not need the <ul> tag. if (!$hasChildren) { $outputHtml = ''; } // Returns the HTML return sprintf($outputHtml, $childrenHtml); } echo buildNavigation($ppages); ?> 

он будет выглядеть так, как это

  <ul class="parent-class"> <li> <a href="http://example.com/page-1">page 1</a> <ul class="child-class1"> <li> <a href="http://example.com/this-is-child-page">this is child page</a> <ul class="child-class2"> <li> <a href="http://example.com/child-of-child">child of child</a> </li> </ul> </li> </ul> </li> </ul> 

Я хотел бы поблагодарить г-на @Maxime Morin.