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