2013-07-24 192 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)`。