2012-04-20 81 views
0

好吧,我不明白爲什麼這不起作用,也許你們中的一個人可以幫助我。PHP:從遞歸函數返回多維數組

$new_upline = RetrieveUpline($root_referral_id, array()); 
echo ("The upline after return: <BR>"); 
var_dump ($new_upline); 

function RetrieveUpline($root_ref_id, $upline){ 
    $referrer = mysql_query("SELECT id, username, referral_ID, total_points_earned, isbanned FROM members WHERE id = ".$root_ref_id); 
    $rows = mysql_num_rows($referrer); 
    $upline_size = count($upline); 

    if ($rows>0){ 
     while($feed = mysql_fetch_array($referrer, MYSQL_ASSOC)){ 
      $upline[$upline_size] = $feed; 
      RetrieveUpline($upline[$upline_size]['referral_ID'], $upline); 
     } 
    }else{ 
     echo ("The upline before return: <BR>"); 
     var_dump($upline); 
     return $upline; 
    } 
} 

該函數內的var_dump按預期工作。即使將其設置爲原始文本,返回也不會返回任何結果。我知道這可能是一件容易的事,但我現在已經被燒光了。

+1

不必返回在'if'分支 – knittl 2012-04-20 15:41:52

+0

你至少應該獲得NULL東西。 – 2012-04-20 15:49:07

回答

1

試試這個版本:

<?php 

    function RetrieveUpline($root_ref_id, $upline = array()) { 

    // Sanitize input 
    $root_ref_id = (int) $root_ref_id; 

    // Do query 
    $query = " 
     SELECT id, username, referral_ID, total_points_earned, isbanned 
     FROM members 
     WHERE id = $root_ref_id 
    "; 
    $result = mysql_query($query); // What if this query fails? Add error handling here... 

    // Loop results 
    while ($feed = mysql_fetch_assoc($result)) { 
     $upline[] = $feed; 
     $upline = RetrieveUpline($feed['referral_ID'], $upline); 
    } 

    // Free mysql result resource 
    mysql_free_result($result); 

    // Return new array 
    return $upline; 

    } 

    $new_upline = RetrieveUpline($root_referral_id); 
    var_dump($new_upline); 

您需要通過參考要麼通過$upline說法,或者從任一選項返回的結果 - 是否有結果還是不行。我會去返回每個結果選項,因爲這意味着在調用函數之前不需要初始化結果數組。這種方法的缺點是,這將是更多的內存餓了,所以你可以使用這個版本來代替:

<?php 

    function RetrieveUpline($root_ref_id, &$upline) { 

    // Make sure $upline is an array (for first iteration) 
    if (!is_array($upline)) $upline = array(); 

    // Sanitize input 
    $root_ref_id = (int) $root_ref_id; 

    // Do query 
    $query = " 
     SELECT id, username, referral_ID, total_points_earned, isbanned 
     FROM members 
     WHERE id = $root_ref_id 
    "; 
    $result = mysql_query($query); // What if this query fails? Add error handling here... 

    // Loop results 
    while ($feed = mysql_fetch_assoc($result)) { 
     $upline[] = $feed; 
     RetrieveUpline($feed['referral_ID'], $upline); 
    } 

    // Free mysql result resource 
    mysql_free_result($result); 

    } 

    RetrieveUpline($root_referral_id, $new_upline); 
    var_dump($new_upline); 
+0

不錯。我只會在$ result爲false時處理,否則如果$ result爲false,您將在mysql_fetch_assoc()行發出警告。 – 2012-04-20 15:58:02

+0

@MarcusAdams的確,我在代碼中發表了一個評論,因爲我不知道OP如何處理這個('trigger_error()',返回'FALSE'等)。我已經將'(int)'強制轉換爲清理,以便任何不是有效數字的內容都是'0',並且不會在查詢中導致語法錯誤。 – DaveRandom 2012-04-20 15:59:50

+0

我沒有想到這一點。我想你也可以使用PDO並準備好語句,如果你有一個包裝函數,並且你將遞歸參數傳遞給準備語句的句柄。如果PHP不必每次都發送查詢,並且MySQL不必每次都解析它,那麼考慮性能增益。 – 2012-04-20 16:05:33