Intereting Posts
javascript автозаполнение текстовых входов на основе выпадающего выделения $ db-> loadObjectList и ошибка mysql_fetch_array Как вызвать скрипт PHP с использованием AJAX внутри функции переключения JQuery? В php я отправляю почту с помощью mail (), она не должна сохраняться в папке отправленных элементов Doctrine 2.5 Неожиданное поведение выборки ассоциации Как самостоятельно использовать один компонент Zend Framework, такой как XML-RPC или REST? PHP: создание обрезанных миниатюр изображений, проблем Как получить значение выпадающего меню HTML с помощью PHP? Как создать простой рейтинг звезд с помощью span или ul li с помощью CSS и jQuery? Как получить доступ к контейнеру службы в глобальной вспомогательной функции symfony2 (услуге)? Лучшая практика для включения JS (с PHP) в файл функций WordPress Regex заменить слово, если оно не заключено в скобки PHP HTML DOM Parser php файл отправляет переменную в внешний файл .js API Google Диска – Библиотека клиентов PHP – настройка uploadType для возобновляемой загрузки

рекурсивная функция для получения всех дочерних категорий

Вот что я пытаюсь сделать: – Мне нужна функция, которая при передаче в качестве аргумента ID (для категории вещей) предоставит все подкатегории и под-подкатегории и суб-суб-суб … , – Я думал использовать рекурсивную функцию, так как я не знаю, сколько подкатегорий их подкатегории и так далее, вот что я пытался сделать до сих пор

function categoryChild($id) { $s = "SELECT * FROM PLD_CATEGORY WHERE PARENT_ID = $id"; $r = mysql_query($s); if(mysql_num_rows($r) > 0) { while($row = mysql_fetch_array($r)) echo $row['ID'].",".categoryChild($row['ID']); } else { $row = mysql_fetch_array($r); return $row['ID']; } } 

Если я использую return вместо echo, я не получу тот же результат. Мне нужна помощь, чтобы исправить это или переписать его с нуля

Мне было трудно найти вашу функцию. Я думаю, что это будет делать то, что вы хотите. Он получает всех детей категории с ID ID, а также их детей (таким образом, получая всю подкатегорию, эффект подкатегории, который вы хотели).

 function categoryChild($id) { $s = "SELECT ID FROM PLD_CATEGORY WHERE PARENT_ID = $id"; $r = mysql_query($s); $children = array(); if(mysql_num_rows($r) > 0) { # It has children, let's get them. while($row = mysql_fetch_array($r)) { # Add the child to the list of children, and get its subchildren $children[$row['ID']] = categoryChild($row['ID']); } } return $children; } 

Эта функция вернет:

 $var = array( 'categoryChild ID' => array( 'subcategoryChild ID' => array( 'subcategoryChild child 1' => array(), 'subcategoryChild child 2' => array() ) ), 'anotherCategoryChild ID' => array() # This child has no children of its own ); 

Он в основном возвращает массив с идентификатором дочернего элемента и массив, содержащий идентификаторы его дочерних элементов. Надеюсь, это поможет.

дерево базы данных в многомерный массив

 <?php function getTree($rootid) { $arr = array(); $result = mysql_query("select * from PLD_CATEGORY where PARENT_ID='$rootid'"); while ($row = mysql_fetch_array($result)) { $arr[] = array( "Title" => $row["Title"], "Children" => getTree($row["id"]) ); } return $arr; } ?> 

Поскольку это было воспитано @Pawan Sharma, я подумал, что могу дать и ответ.

Все эти решения имеют общую проблему – они выполняют SQL-запрос для каждого ребенка. Например, если на втором уровне установлено 100 where parent_id in (<list_of_ids>) , тогда будет выполнено 100 запросов, в то время как это можно сделать в одном запросе, используя where parent_id in (<list_of_ids>) .


Пример БД:

 create table category ( id int auto_increment primary key, parent_id int default null, title tinytext, foreign key (parent_id) references category (id) ) engine = InnoDB; insert into category (id, parent_id, title) values (1, null, '1'), (2, null, '2'), (3, null, '3'), (4, 1 , '1.1'), (5, 1 , '1.2'), (6, 1 , '1.3'), (7, 4 , '1.1.1'), (8, 4 , '1.1.2'), (9, 7 , '1.1.1.1'); 

Вот мое решение:

 /** * @param null|int|array $parentID */ function getTree($parentID) { $sql = "select id, parent_id, title from category where "; if ( is_null($parentID) ) { $sql .= "parent_id is null"; } elseif ( is_array($parentID) ) { $parentID = implode(',', $parentID); $sql .= "parent_id in ({$parentID})"; } else { $sql .= "parent_id = {$parentID}"; } $tree = array(); $idList = array(); $res = mysql_query($sql); while ( $row = mysql_fetch_assoc($res) ) { $row['children'] = array(); $tree[$row['id']] = $row; $idList[] = $row['id']; } mysql_free_result($res); if ( $idList ) { $children = getTree($idList); foreach ( $children as $child ) { $tree[$child['parent_id']]['children'][] = $child; } } return $tree; } 

С предоставленными образцовыми данными он выполняет не более 5 запросов, когда он называется getTree(null) (для всех записей):

 select id, parent_id, title from category where parent_id is null select id, parent_id, title from category where parent_id in (1,2,3) select id, parent_id, title from category where parent_id in (4,5,6) select id, parent_id, title from category where parent_id in (7,8) select id, parent_id, title from category where parent_id in (9) 

Когда getTree(4) как getTree(4) , выполняются 3 запроса:

 select id, parent_id, title from category where parent_id = 4 select id, parent_id, title from category where parent_id in (7,8) select id, parent_id, title from category where parent_id in (9) 
 function categoryChild($id) { $s = "SELECT category_id,name FROM proads_categories WHERE parent_id =".$id; $r = mysql_query($s); $children = array(); if(mysql_num_rows($r) > 0) { #It has children, let's get them. while($row = mysql_fetch_array($r)) { #Add the child to the list of children, and get its subchildren $children[$row['category_id']]['nam'] = $row['name']; $arr = categoryChild($row['category_id']); if(count($arr) > 0) { $children[$row['category_id']]['child'] = categoryChild($row['category_id']); } } } return $children; } 

Идеально. Если вам нужно, попробуйте это

 function breadCrumb($id) { $ar = array(); $result = mysql_query("SELECT * FROM groups WHERE ParentID = '$id'"); if(mysql_num_rows($result) > 0) { while($row = mysql_fetch_object($result)) { $ar[] = $row->DBGroupID; $r = mysql_query("SELECT * FROM groups WHERE ParentID = '".$row->GroupID."'"); if(mysql_num_rows($r) > 0) $ar = array_merge($ar, breadCrumb($row->GroupID, 1)); } } return $ar; } 
 <?php require('db/dbconnect.php'); $user_id='triD-100'; $sql="select * from ajent_joining where sponser_id='".$user_id."'"; $qR=mysql_query($sql); while($rowD=mysql_fetch_assoc($qR)){ echo $childId=$rowD["user_id"]; echo "<br/>"; categoryChild($childId); } function categoryChild($childId) { $s = "select user_id from ajent_joining where sponser_id='".$childId."'"; $r = mysql_query($s); if(mysql_num_rows($r) > 0) { while($row = mysql_fetch_array($r)) { echo $childId=$row["user_id"]; echo "<br/>"; categoryChild($childId); } } } ?> в <?php require('db/dbconnect.php'); $user_id='triD-100'; $sql="select * from ajent_joining where sponser_id='".$user_id."'"; $qR=mysql_query($sql); while($rowD=mysql_fetch_assoc($qR)){ echo $childId=$rowD["user_id"]; echo "<br/>"; categoryChild($childId); } function categoryChild($childId) { $s = "select user_id from ajent_joining where sponser_id='".$childId."'"; $r = mysql_query($s); if(mysql_num_rows($r) > 0) { while($row = mysql_fetch_array($r)) { echo $childId=$row["user_id"]; echo "<br/>"; categoryChild($childId); } } } ?> 

Использование функции Prestashop:

 public function getRecursiveChildren() { $subCategories = $this->recurseLiteCategTree(); //print_r($subCategories); $my_tab = array(); foreach ($subCategories['children'] as $subc) { $my_tab[] = $subc['id']; foreach ($subc['children'] as $subc2) { $my_tab[] = $subc2['id']; foreach ($subc2['children'] as $subc3) { $my_tab[] = $subc3['id']; foreach ($subc3['children'] as $subc4) { $my_tab[] = $subc4['id']; } } } } $my_tab [] = $this->id; return $my_tab; } 

это может быть улучшено с использованием рекурсивности, но сегодня нет времени: '(