2016-08-01 26 views
0

私は親のIDを取得していますが、1つの配列に保存することができず、代わりに最後の値が挿入されている1つの配列を返すことができない子のすべての親を見つける関数を持っています。私の場合はarray_pushが動作しません。ストアの再帰関数の値

function has_parent($parent,$con) { 
    $return = array(); 
     $selectparent = "select * from table where id = $parent "; 
     $qResult = mysqli_query($conobj,$selectparent); 
     $qRow = mysqli_fetch_assoc($qResult); 
     $parent_id = $qRow['parent_id']; 
     if ($parent_id != 0) { 
      //$return[] = $parent_id; 
      echo $parent_id; // geting parent id as 432 
      $return[] = $parent_id; 
      $a = has_parent($parent_id, $con); 
     }else{ 
      return $parent_id; 
     } 

    return $return; 
} 

$marray = folder_has_parent($parent ,$con); 
print_r($marray); // getting last array only 

Array 
(
    [0] => 4 
) 

予想される出力:

Array 
(
    [0] => 4 
    [1] => 3 
    [3] => 2 
) 
+0

あなたは再結論の結果を使用しません(ここでは '$ a'変数を保存しないでください)。 – Arnial

+0

リンクを確認してください:http://avenir.ro/multi-level-unlimited-menu-php-sub-menus/ –

答えて

0

あなたが行$return = array();で再帰関数を呼び出す$returnすべての時間をオーバーライドしています。その代わりに、$returnをグローバル変数にしようとする必要があります。したがって、関数スコープには存在しません。

function has_parent($parent,$con) { 
    global $return; // global variable 
    $selectparent = "select * from table where id = $parent "; 
    $qResult = mysqli_query($conobj,$selectparent); 
    $qRow = mysqli_fetch_assoc($qResult); 
    $parent_id = $qRow['parent_id']; 
    if ($parent_id != 0) { 
     //$return[] = $parent_id; 
     echo $parent_id; // geting parent id as 432 
     $return[] = $parent_id; 
     $a = has_parent($parent_id, $con); 
    }else{ 
     return $parent_id; 
    } 

    return $return; 
} 

$return = array(); // setting the global variable 
$marray = folder_has_parent($parent ,$con); 
print_r($marray); 
+0

それはトリックを行いますが、グローバル変数は悪い習慣です。 – Arnial

+0

'global'が気に入らないのなら、' $ GLOBALS ['return'] 'や' $ _SESSION ['return'] 'を使うか、ファイルに書き込むことができます。 – LordPeinVII

+0

一時変数の格納に$ GLOBALSまたは$ _SESSIONを使用するとさらに悪化します。 – Arnial

0

これは、array_mergeのために遅いかもしれませんが、あなたが望む順序で配列を返します。時間を照会するために比較するが、私は第二の変形を使用することを好むだろう

function has_parent($parent,$con) { 
    $return = array(); 
    $selectparent = "select * from table where id = $parent "; 
    $qResult = mysqli_query($conobj,$selectparent); 
    $qRow = mysqli_fetch_assoc($qResult); 
    $parent_id = $qRow['parent_id']; 
    if ($parent_id != 0) { 
     $return = [ $parent_id ]; 
     $return = array_merge($return, has_parent($parent_id, $con)); 
    }  
    return $return; 
} 

これは、より速く動作するかもしれませんが、結果は逆の順序で配列のコピーに必要なコースの時間を

function has_parent($parent,$con) { 
    $return = array(); 
    $selectparent = "select * from table where id = $parent "; 
    $qResult = mysqli_query($conobj,$selectparent); 
    $qRow = mysqli_fetch_assoc($qResult); 
    $parent_id = $qRow['parent_id']; 
    if ($parent_id != 0) { 
     $return = has_parent($parent_id, $con); 
     $return[] = $parent_id; 
    } 
    return $return; 
} 

になりますが、無視することができるであろうarray_reverseを実行します。それは(私の意見では)読みやすくなっています。

UPDATE:この関数は、反復関数に簡単に書き換えることができます。反復関数は理解しやすく(味のメーター)、再帰的であっても(少なくともmemmoryが少なくて済むように)うまくいくかもしれません。

function has_parent($parent,$con) { 
    $return = array(); 
    do{ 
     $selectparent = "select * from table where id = $parent "; 
     $qResult = mysqli_query($conobj,$selectparent); 
     $qRow = mysqli_fetch_assoc($qResult); 
     $parent_id = $qRow['parent_id']; 
     if($parent_id != 0) { 
      $return[] = $parent_id; 
      $parent = $parent_id; 
     } 
    } while($parent_id != 0); 
    return $return; 
}