2013-03-04 111 views
0

我想做一个分类树系统来显示无尽的类别。该数据库是建立这样的:PHP分类与子分类

ID PARENT_ID CATEGORY_NAME

PHP代码:

$cat_array = array(); 
$subcat_array = array(); 
if (mysqli_connect_errno()) 
      { 
      echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
      }   

$sql = mysqli_query($con, "SELECT * FROM `documents_category` WHERE ISNULL(parent_id) "); 
while($row = mysqli_fetch_array($sql)) 
{  $cat_array[] = $row; 
//echo $row['category_name']; 
} 

// print_r($cat_array); 


$sql2 = mysqli_query($con, "SELECT * FROM `documents_category` 
WHERE parent_id IS NOT NULL "); 
while($row2 = mysqli_fetch_array($sql2)) 
{  $subcat_array[] = $row2; 
} 

foreach ($cat_array as $value) 

{ 
    echo "{$value['category_name']}<br/>"; 

    foreach ($subcat_array as $value2) 

    { 
      if($value2['parent_id'] == $value['id']) 

      { 
      echo "{$value2['category_name']}<br/>"; 
      } 


    } 

}

子类别只想用父母的ID。我可以把这个工作交给一个家长和一个小组,但是之后却没有出现。我尝试了这几种不同的方式,但没有运气。有什么建议?

+0

看看这个http://stackoverflow.com/questions/14795956/multilevel-menu-from-数据库记录 – 2013-03-04 13:49:11

+0

告诉我们你的表结构。我认为我们可以通过单个查询找到解决方案。 – TNK 2013-03-04 14:23:33

+0

http://i48.tinypic.com/akv800.png – Daniel 2013-03-04 18:30:23

回答

0

您需要使用递归。通常我使用PDO,但我试图做一个工作示例:

<?php 
$cat_array = array(); 
$subcat_array = array(); 
if (mysqli_connect_errno()) 
{ 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
}   

function GetCategories($parent_id, $counter = 0) 
{ 

    $sql = mysqli_query($con, "SELECT * FROM `documents_category` WHERE parent_id = " . (int)$parent_id); 
    while($row = mysqli_fetch_array($sql)) 
    { 
     echo str_repeat("&nbsp;", $counter) . $row["id"] . " - " . $row["parent_id"] . " - " . $row["category_name"]; 
     $sub_category = mysqli_query($con, "SELECT * FROM `documents_category` WHERE parent_id = " . (int)$row["id"]); 
     $counter++; 
     if(count($sub_category) > 0) 
      GetCategories($row["id"], $counter); 
    } 
} 

$parent_categories = GetCategories(0); 
?> 

如您所见,我通过调用函数来选择“根”。它会回应类别。然后检查它是否具有当前id的子类别,如果找到,则再次调用该函数,但现在使用当前行的parent_id。如果没有找到,它会走得更远... 您可以使用计数器来添加空格或东西....

+0

感谢这个答案,我仍然会运行$ cat_array数组上的原始foreach,并让每个迭代上运行递归函数?抱歉,我是这个新手。 – Daniel 2013-03-04 20:23:06