我想写一个递归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(' ',$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);