【问题标题】:Simple recursive tree in PHP / MySQLPHP / MySQL中的简单递归树
【发布时间】:2013-11-29 13:03:17
【问题描述】:

我在 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++; )

谢谢!

【问题讨论】:

    标签: php mysql recursion tree family-tree


    【解决方案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+1);
              }
         }
    }
    

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

    【讨论】:

    • 我编辑了我的问题;)我工作了!!但很奇怪......因为一开始我试图把 $level++;就在该函数之前: echo str_repeat("-",$level).$row['name']."
      "; $级别++;树($data,$row['id'],$level);它没有用。我没有尝试您的解决方案,因为我认为它是相同的......!非常感谢;)
    • 你不需要$level++,只要你更深一层,你只需要$level+1
    • 谢谢@Frits-van-Campen
    • 你也可以使用 ++$lavel。树($data,$row['id'],++$level);但不是 tree($data,$row['id'],$level++);
    【解决方案2】:

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

    函数 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 down from using array in php? 参考此代码的一些高级版本

    【讨论】:

      【解决方案3】:

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

      或者在您的情况下可能是 str_repeat("-", $row['mother'] - 1),因为您不想在奶奶面前以 - 开头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 2018-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        相关资源
        最近更新 更多