2010-03-07 4 views
8

Voici ce que j'essaie de faire: - J'ai besoin d'une fonction qui, une fois passée en argument, un ID (pour une catégorie de choses) fournira toutes les sous-catégories et le sous sous-catégories et sous-sous-sous-ensembles. - Je pensais à utiliser une fonction récursive car je ne sais pas le nombre de sous-catégories de leurs sous-sous-catégories et ainsi de suite voici donc ce que j'ai essayé de le faire jusqu'à présentfonction récursive pour obtenir toutes les catégories enfant

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']; 
    } 
} 

Si j'utilise retour au lieu de l'écho, je n'obtiendrai pas le même résultat. J'ai besoin d'aide pour résoudre ce problème ou le réécrire de zéro

Répondre

12

J'ai eu du mal à comprendre votre fonction. Je pense que cela fera ce que tu veux. Il obtient tous les enfants d'une catégorie avec ID $ id, et aussi leurs enfants (obtenant ainsi toute la sous-catégorie, sous-catégorie de l'effet que vous vouliez).

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; 
} 

Cette fonction retourne:

$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 
); 

Il revient essentiellement un tableau avec l'ID de l'enfant et un tableau contenant les identifiants de ses enfants. J'espère que cela aide.

+0

Merci, ça m'a aidé aussi – Umair

4

database tree to multidimensional array

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

Il est parfait. Si vous avez besoin, essayez ceci

4

Comme cela a été évoqué par @Pawan Sharma, j'ai pensé que je pourrais donner une réponse aussi bien.

Toutes les solutions données souffrent d'un problème commun: elles exécutent une requête SQL pour chaque enfant. Par exemple, s'il y a 100 enfants au deuxième niveau, alors 100 requêtes seront effectuées, alors que cela peut effectivement être fait en en utilisant le en utilisant where parent_id in (<list_of_ids>).


Sample DB:

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'); 

Voici ma solution:

/** 
* @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; 
} 

Avec les données fournies de l'échantillon, il fait dans la plupart des 5 requêtes, lorsqu'elles sont appelées getTree(null) (pour tous entrées):

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) 

Quand appelé getTree(4), 3 requêtes sont effectuées:

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) 
1
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; 
} 
0

Utilisation de la fonction 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; 
} 

cela peut être amélioré en utilisant récursivité, mais pas le temps aujourd'hui: '(

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

} 


?> 
Questions connexes