it-swarm.dev

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

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

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, я не получу тот же результат. Мне нужна помощь, чтобы это исправить или переписать с нуля

11
user253530

Мне было трудно понять вашу функцию. Я думаю, что это будет делать то, что вы хотите. Он получает всех дочерних элементов категории с идентификатором $ 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
);

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

13
Bruno De Barros

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

<?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;
}
?>
5
Matthew

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

Все данные решения имеют общую проблему - они выполняют SQL-запрос для каждого ребенка. Например, если на 2-м уровне 100 дочерних элементов, то будет выполнено 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) выполняются 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)
4
binaryLV
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;
}
1
sven
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;
}

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

1
Pawan Sharma
<?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);
    }
}

}


?>
1
Vikas Sharma

Использование функции 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;
}

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

0
Karim Slamani