2012-04-20 24 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が期待通りに機能します。たとえ私が生のテキストに設定したとしても、返されても何も返されません。私はそれはおそらく何かが簡単だと知っていますが、私は今すぐ焼き尽くされています。 - そこに結果であるかどうかあなたが参照によって$upline引数を渡すか、あるいはいずれかのオプションから結果を返すためにどちらかの必要

<?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); 

+1

あなたは、少なくともNULLを取得する必要があります – knittl

+0

あなた 'if'ブランチには何も返していません。 –

答えて

1

は、このバージョンをお試しください。関数を呼び出す前に結果配列を初期化する必要はありません。すべての結果オプションを返すようにします。私は多分あなたは、「階層データ」を得ることについて何かを読んでください、それは問題ではありませんでした知っているが、

<?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()行に警告が表示されます。 –

+0

@MarcusAdams実際には、OPがこれ( 'trigger_error()'を処理し、 'FALSE'などを返す)をどのように処理したいのかわからないので、その旨のコードにコメントを付けます。 '(int)'キャストをサニタイズに入れました。そのため、有効な数値でないものはすべて '0'になり、クエリで構文エラーが発生することはありません。 – DaveRandom

+0

私はそれについて考えなかった。私はあなたがラッパー関数を持っていて、再帰的パラメータの1つとして準備されたステートメントへのハンドルを渡したならば、PDOとプリペアドステートメントを使うこともできると思います。 PHPが毎回クエリを送信する必要がなく、毎回MySQLがそれを解析する必要がない場合は、パフォーマンスの向上について考えてみてください。 –

0

:このアプローチの欠点は、かなり多くのメモリ空腹になるということですので、あなたの代わりに、このバージョンを使用することができますそれに取り組んでいます。あなたが今それを行う方法は非常に... mh、私は "遅く"言うことができます。