簡體   English   中英

PHP / MySQL中的簡單遞歸樹

[英]Simple recursive tree in PHP / MySQL

我在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[]的數組中對此信息進行almacenate

$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++;犯了錯誤else $level++; ,因為在$row['mother'] != $mom時添加級別,遍歷所有行,但我不知道如何制作它。 有誰知道? 謝謝。

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

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

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

謝謝!

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所以我可以測試嗎?

您可以嘗試這樣,它以Array格式返回值。 我將此功能用於Item category Tree,

function categoryDropDown($categoryArray, $parentId, $level, $options)
{   
    $level++;
    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);         
        }
    }   
    return $options;    
}

---- ----輸出

//Array Key contains category Id.


Array
(
    [1] => Electronics
    [2] => >> Mobile
    [5] => >> >> Mobile Accessories
    [7] => >> >> >> Sub Category 1
    [9] => >> >> >> Sub Category 3
    [3] => >> Laptop
    [6] => >> >> Laptop Accessories
    [8] => >> >> >> Sub Category 2
    [10] => >> >> >> Sub Category 4
    [4] => >> Tablet
    [11] => Main Category 2
)

你可以在這里參考這個代碼的一些高級版本如何在php中顯示從使用數組中選擇多個下拉列表?

str_repeat("-", $level)str_repeat("-", $row['mother'])替換str_repeat("-", $level) str_repeat("-", $row['mother'])嗎?

或者,也許你的情況str_repeat("-", $row['mother'] - 1)如你不想開始一個-在奶奶面前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM