3

我在 MySQL 中有这张表:

id       name            mother
1        grandma         0
2        myuncle         1
3        mymom           1
4        me              3
5        mysister        3
6        myson           4
7        new_grandma_son 1

我在一个名为data[]

$data=array(
        array("id"=>1,"name"=>"grandma",        "mother"=>0),
        array("id"=>2,"name"=>"myuncle",        "mother"=>1),
        array("id"=>3,"name"=>"mymom",          "mother"=>1),
        array("id"=>4,"name"=>"me",             "mother"=>3),
        array("id"=>5,"name"=>"mysister",       "mother"=>3),
        array("id"=>6,"name"=>"myson",          "mother"=>4),
        array("id"=>7,"name"=>"new_grandma_son","mother"=>1)
    );

为了制作家谱,我正在使用这个递归函数:

function tree($data, $mom = 0, $level = 0){
     foreach ($data as $row){
          if ($row['mother'] == $mom) {
               echo str_repeat("-", $level).$row['name']."<br>";
               tree($data, $row['id'], $level);
          }
          else $level++;
     }
}

当我调用该函数tree($data);时,它显示:

grandma
-myuncle (level 1)
-mymom
----me (level 4??)
---------myson (level 9??)
----mysister
----new_grandma_son (level 4??)

我有错误else $level++;,因为在添加级别时$row['mother'] != $mom,遍历所有行,但我不知道如何制作。有谁知道?谢谢你。

解决方案(由 Frits van Campen 提供):

               tree($data, $row['id'], $level+1);

          // (eliminate this else $level++; )

谢谢!

4

3 回答 3

3
function tree($data,$mom=0,$level=0){
     foreach($data as $row){
          if($row['mother']==$mom){
               echo str_repeat("-",$level).$row['name']."<br>";
               tree($data,$row['id'],$level+1);
          }
     }
}

认为这可以修复您的代码。你能提供,$data所以我可以测试它吗?

于 2013-11-29T13:06:12.860 回答
1

您可以尝试这样,它以数组格式返回值。我将此功能用于项目类别树,

    函数 categoryDropDown($categoryArray, $parentId, $level, $options)
{   
    $级别++;
    foreach ($categoryArray as $array)
    {
        if($array['parentId'] == $parentId)
        {
            $opt = str_repeat(">> ", $level-1) 。$array['name'] ;         
            $options[$array['id']] = $opt;
            $newParent = $array['id'];              
            $options = categoryDropDown($categoryArray, $newParent, $level, $options);         
        }
    }   
    返回$选项;    
}

- - 输出 - -

//Array Key 包含类别 ID。


大批
(
    [1] => 电子产品
    [2] => >> 手机
    [5] => >> >> 手机配件
    [7] => >> >> >> 子类别 1
    [9] => >> >> >> 子类别 3
    [3] => >> 笔记本电脑
    [6] => >> >> 笔记本电脑配件
    [8] => >> >> >> 子类别 2
    [10] => >> >> >> 子类别 4
    [4] => >> 平板电脑
    [11] => 主要类别 2
)

您可以在此处参考此代码的一些高级版本How to display select multiple drop from using array in php?

于 2016-08-04T13:41:09.733 回答
0

你不能只用替换str_repeat("-", $level)str_repeat("-", $row['mother'])

或者也许在你的情况下str_repeat("-", $row['mother'] - 1),因为你不想从-奶奶面前开始。

于 2013-11-29T13:09:15.317 回答