递归PHP函数,用于检索指定类别的所有子级


recursive PHP function to retrive all the children for the specified category

我想写一个递归PHP函数来检索指定类别的所有子级。我尝试了这里描述的一个,但它没有输出我所期望的结果。

我的分类表如下:

CREATE TABLE `categories` (
 `category_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
 `category_name` varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `category_slug` varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `category_parent` smallint(5) unsigned NOT NULL DEFAULT '0',
 `category_description_ro` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `category_description_en` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`category_id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1

Bellow是表中数据的一个示例:

category id | category name | category_parent
1            Categoria 1            0        
2            Categoria 2            0        
3            Categoria 3            0        
4            Categoria 1.1          1        
5            Categoria 1.2          1        
6            Categoria 1.3          1        
7            Categoria 1.1.2        4 

我想知道如何在PHP中递归地打印这个。

这个呢:

<?php    
$result=mysql_query("SELECT * FROM categories");
// Builds the array lists with data from the categories table
while ($items = mysql_fetch_assoc($result))
{
    $categories['items'][$items['category_id']] = $items;
    $categories['parents'][$items['category_parent']][] = $items['category_id'];
}    
//the function
function category_tree($parent, $array)
{
   $return = "";
   if (isset($array['parents'][$parent]))
   {
      $return .= "<ul>";
       foreach ($array['parents'][$parent] as $itemId)
       {
          if(!isset($array['parents'][$itemId]))
          {
             $return .= "<li>".$array['items'][$itemId]['category_name']."</li> 'n";
          }
          if(isset($array['parents'][$itemId]))
          {
             $return .= "<li>".$array['items'][$itemId]['category_name'];
             $return .= category_tree($itemId, $array);
             $return .= "</li>";
          }
       }
       $return .= "</ul>";
   }
   return $return;
}

echo category_tree(0, $categories);
?>

假设您的数据已初始化为数组$data

$data = array(array("1", "Categoria 1", "0"),
        array("2", "Categoria 2", "0"),
        array("3", "Categoria 3", "0"),
        array("4", "Categoria 1.1", "1"),
        array("5", "Categoria 1.2", "1"),
        array("6", "Categoria 1.3", "1"),
        array("7", "Categoria 1.1.2", "4"));

您可以使用以下

function build_tree($data, $cat=0, $indent=0)
{
    $out = "";
    foreach($data as $entry)
    {
        if ($entry[2] != $cat)
            continue;
        $padding = str_repeat(' ',$indent);
        $out .= sprintf("%s<li>%s</li>'n", $padding, $entry[1]);
        if ($sub = build_tree($data, $entry[0], $indent+4))
            $out .= sprintf("%s<ul>'n%s%s</ul>'n", $padding, $sub, $padding);
    }
    return $out;
}
print build_tree($data);

以上将打印

<li>Categoria 1</li>
<ul>
    <li>Categoria 1.1</li>
    <ul>
        <li>Categoria 1.1.2</li>
    </ul>
    <li>Categoria 1.2</li>
    <li>Categoria 1.3</li>
</ul>
<li>Categoria 2</li>
<li>Categoria 3</li>

未测试,但认为至少应该是这样的

function PrintRecursive($sql, $id = 0){
    $query = mysql_query("SELECT category_id,category_name,category_parent FROM categories WHERE category_parent = {$id}", $sql);
    while($row = mysql_fetch_array($query)){
        echo $row['category_id'] ." | ". $row['category_name'] ." | ". $row['category_parent'] ."<br/>";
        PrintRecursive($sql, $row['category_parent']);
    }
}

好吧,因为你说过你想要特定类别的结果。

假设$category_id为1

    function Subcats($category_id){
        $getsubcats = mysql_query("SELECT * FROM categories WHERE category_parent = $category_id");
$sub_cats = mysql_num_rows($getsubcats);
    if($sub_cats == 0){
    echo "There are no sub categories for this category";
    }
    else {
        while($rowsubcats = mysql_fetch_array($getsubcats)){
        $sub_cat_id = $rowsubcats['id'];
        $sub_cat_name = $rowsubcats['name'];
        // other row info
        echo "write what you want to display here<BR>";
        } // end loop for each sub cat
    } // end if subcats > 0
}

这里是我的选项层次结构的已采用/未测试版本(如果我的两个问题的答案都是肯定的):

function GetOptions($parentSection,$level)
  { 
    $result = mysql_query('select category_id,category_name,category_parent from categories AS names where (category_parent='.$parentSection.') ORDER BY category_id;');
    $level_prefix=str_repeat('&nbsp;&nbsp;',$level);
    if($result)
    {   while ($row = mysql_fetch_array($result))
        {  
                $sec .= '<option value="'.$row['category_id'].'">'.$level_prefix.$star.$row['category_name'].'</option>';
                 GetOptions($row['category_id'],$level+1*2);}
        }
    }
    return $sec; $sec = '';
  }

您称之为(如果您使用Options,请不要忘记SELECT标签):

echo GetOptions(0,0);