2013-07-24 238 views
2

我有MySQL表所示:遞歸函數來遍歷二叉樹

userid left_refid right_ref_id 
1    3  4 
3    5  6 

等。我想要通過二叉樹並顯示所有用戶標識符,以及左側和右側的引用標識符。

這是我使用的代碼,但它連續打印。

function display_childs($parent) { 

    //$result = mysql_query("SELECT title FROM tree WHERE parent=".$parent.'";'); 
    global $wpdb; 
    $prefix=$wpdb->prefix; 
    if($parent==0){ 
     $parent=3; 
    } 
    $user_ref_1 = $wpdb->get_results($wpdb->prepare("SELECT * FROM wp_user_reference WHERE user_id=".$parent."")); 

    foreach($user_ref_1 as $urd) 
    { 
     echo $urd->user_id; 
     echo $urd->left_zone_id; 
     echo $urd->right_zone_id; 
     echo '<br>'; 
     $user_idpass=$urd->user_id; 
    } 

    display_childs($user_idpass); 
    unset($user_idpass); 
    unset($parent); 
} 

display_childs(0); 
+1

你會得到什麼結果,你想要什麼結果? – Herbert

+0

它連續打印134,我想要打印所有用戶ID,並且左邊的Ref ID .., – wordpresrox

+0

我編輯了你的問題來澄清這一點。你應該仔細檢查,並確保我的判斷正確。另外,請考慮閱讀[寫出完美的問題](http://tinyurl.com/so-hints) – Herbert

回答

1

您當前的函數遞歸調用自身display_childs($user_idpass);,但是這將始終與「父」 ID和永遠不會被稱爲「孩子」 IDS

foreach循環,你也應該打電話display_childs($urd->left_zone_id)display_childs($urd->right_zone_id)(和刪除撥打display_childs($user_idpass);

+1

你能解釋一下嗎? – Bytemain

+1

OP在遞歸調用中的方式,它將始終查詢「父」節點,而不是「子節點」節點,除非他用自己的ID調用函數 – Verma

+0

我會將它添加到您的答案中。這似乎是正確的軌道。 – Bytemain

2

通常情況下這棵樹不支持遞歸,但你可以嘗試在運營商之間在where子句中:SELECT * FROM其中3,7之間left_ref_id和3,7之間right_ref_id拉孩子。尋找嵌套集表或celko樹。

更新:您也可以嘗試在for循環中遞歸調用display_childs($ urd-> left_zone_id)and display_childs($ ur-> right_zone_id)`。