Php 从邻接列表类别创建html表

Php 从邻接列表类别创建html表,php,html,Php,Html,我使用这个代码片段从mySql数据库中获取所有类别项并列出它们。正如您所猜测的,有主要类别及其子类别,如类别A和it子类别/后代,然后是类别B及其子类别/后代,等等 现在,我想创建一个永久类别的HTML表(比如4列),并将每个类别及其子类别放入一个表中,例如: 更新 Html Table 1 Category A Child3 Child6 Child11 Child1 Child4 Child7 Child12 Child

我使用这个代码片段从mySql数据库中获取所有类别项并列出它们。正如您所猜测的,有主要类别及其子类别,如类别A和it子类别/后代,然后是类别B及其子类别/后代,等等

现在,我想创建一个永久类别的HTML表(比如4列),并将每个类别及其子类别放入一个表中,例如:

更新

    Html Table 1

  Category A    Child3      Child6   Child11
  Child1        Child4      Child7   Child12
  Child 1.1     Child5      Child8   Child13
  Child 1.2     Child 5.1   Child9
  Child2        Child 5.2   Child10
这是我用来获取类别和child列表的代码片段。它正确列出了所有类别和子类别。现在我喜欢在HTML表格中用列显示列表。我被卡住了。我怎样才能做到这一点

        $categoryArr = Array();

        while($categoryRow = mysql_fetch_array($category_query_result)){
            $categoryArr[] = array('parentid'=>$categoryRow['parent_id'],
            'childof'=>$categoryRow['child_of'],
            'categorytitle'=>$categoryRow['category_title'],
            'categoryfilename'=>$categoryRow['category_file_name'],
            'level'=>$categoryRow['level_num']);
        }



        function display_categories($Arr,$thisparent,$level){
            foreach ($Arr AS $key => $catNode ){
                if($catNode['childof']=="$thisparent"){
                    echo "" .$catNode['categorytitle'] ."<br>";

                      display_categories($Arr, $catNode['parentid'] ,$level+1);

                } 

            }

        }

        display_categories($categoryArr,0,1);
$categoryArr=Array();
while($categoryRow=mysql\u fetch\u数组($category\u query\u result)){
$categoryArr[]=数组('parentid'=>$categoryRow['parent_id'],
'childof'=>$categoryRow['childof'],
'categorytitle'=>$categoryRow['category_title'],
'categoryfilename'=>$categoryRow['category_file_name'],
“级别”=>$categoryRow[“级别数量]);
}
功能显示\u类别($Arr、$thisparent、$level){
foreach($Arr AS$key=>$catNode){
if($catNode['childof']==“$thisparent”){
回显“$catNode['categorytitle]”。
; 显示类别($Arr、$catNode['parentid'],$level+1); } } } 显示类别($categoryArr,0,1);
更新:

$categoryArr=array(array(“parentid”=>1,“title”=>“Father 1”、“childof”=>0)、array(“parentid”=>2、“title”=>“Son 1.2”、“childof”=>1)、array(“parentid”=>3、“title”=>“孙子1.2.3”、“childof”=>2)、array(“parentid”=>4、“title”=>“Son 1.4”、“childof”=>1)、array(“parentid”=>5、“title”=>1.5”、“childof”=>1)、array(“parentid”=>6”、“childof”=>1.1),数组(“parentid”=>7,“title”=>“孙子1.5.7”,“childof”=>5),数组(“parentid”=>8,“title”=>“父亲8”,“childof”=>0),数组(“parentid”=>9,“title”=>“儿子8.9”,“childof”=>8),数组(“parentid”=>10,“title”=>“孙子1.2.3.10”,“childof”=>3);
函数重建($data$find)
{
$cache=array_filter($data,create_函数(“$n”,“return$n[“childof”]==”.$find.;”);
$rt=array();
foreach($cache as$node)
{
$rt[]=$node;
$rt=array_merge($rt,rebuild($data,$node[“parentid”]);
}
返回$rt;
}
$cache=array_filter($categoryArr,function($n){return$n[“childof”]==0;});
$base=array();
foreach($root缓存)
{
$base[]=array_merge(array($root),rebuild($categoryArr,$root[“parentid”);
}
$xml=新的DOMDocument(“1.0”、“UTF-8”);
$xml->formatOutput=true;//只是为了调试
$root=$xml->createElement(“根”);
$xml->appendChild($root);
foreach($base作为$list)
{
$table=$xml->createElement(“表格”);
$root->appendChild($table);
$rows=ceil(count($list)/4);//将4更改为您需要的任何列
foreach(范围(1,$rows)为$idx)
{
$tr=$xml->createElement(“tr”);
$table->appendChild($tr);
}
$cur=0;
foreach($作为$node列出)
{
如果($cur>=$rows)$cur=0;
$td=$xml->createElement(“td”);
$td->appendChild($xml->createTextNode($node[“title”]);
$table->getElementsByTagName(“tr”)->item($cur)->appendChild($td);
$cur++;
}
}
echo$xml->saveXML();
产出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <table>
    <tr>
      <td>Father 1</td>
      <td>Grandson 1.2.3</td>
      <td>Son 1.4</td>
      <td>Grandson 1.5.7</td>
    </tr>
    <tr>
      <td>Son 1.2</td>
      <td>Grandgrandson 1.2.3.10</td>
      <td>Son 1.5</td>
      <td>Son 1.6</td>
    </tr>
  </table>
  <table>
    <tr>
      <td>Father 8</td>
      <td>Son 8.9</td>
    </tr>
  </table>
</root>
产出:

<?xml version="1.0" encoding="UTF-8"?>
<table>
  <tr>
    <td>Father</td>
    <td>Grandson 2.3</td>
    <td>Son 5</td>
    <td>Son 6</td>
  </tr>
  <tr>
    <td>Son 2</td>
    <td>Son 4</td>
    <td>Grandson 5.6</td>
  </tr>
</table>

父亲
孙子2.3
儿子5
儿子6
儿子2
儿子4
孙子5.6

没有要测试的“真实”数据,所以如果有问题,请告诉我。

您的PHP代码提示可能有两个以上的级别,但您的预期输出只有两个(并且似乎不可扩展)。你得说得更具体些。@路人:是的,可能会有更多的关卡。比如说,Category A->child1->child1.1 e.t.c.无论如何,这不应该是问题,因为我们将从第一个级别/类别开始创建表;e、 g.
父亲:[son1,son2,son3]
预计将显示为
父亲son1,son2,son3
,但父亲:[son1:[孙子1,孙子2,孙子3],son2,son3:[孙子4,孙子5]?假设父亲1有儿子、孙子和孙子。。。所以我想为父亲创建一个表,并将所有父亲和后代——孙子和孙子等等——放入一个有列的表中。对于父辈2,父辈3 e.t.c.也一样。每个表都将包含一个父辈及其分布到列中的所有描述标准。您能否更新您的问题以将孙子和孙子的情况包含在预期结果中?您的代码正常工作,但它将所有项都放在一个表中的数组中。假设数组中有三个主要类别;每个类别都有自己的同级。因此,我们应该为每个类别及其后代生成“表”。所以我们需要三张桌子。@mustafa我以前就想到过,但是你的垂直方向迫使我在构建桌子之前计算桌子中的项目数。这包括重新构建数组并多次循环,再加上DOM和
create\u函数
,我认为这并不便宜。我看看明天能不能来。@mustafa请查看更新的代码。我真不敢相信我居然把你的阵型弄平了。