Вот что я пытаюсь сделать: – Мне нужна функция, которая при передаче в качестве аргумента 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; }
это может быть улучшено с использованием рекурсивности, но сегодня нет времени: '(