2016-08-01 77 views
0

我有函數來查找所有的孩子的父母我已經創建函數我得到父母的ID但不能保存在一個數組中,並返回一個數組而不是隻有最後一個值插入。 array_push在我的情況下不起作用。存儲在數組中的遞歸函數值(PHP)

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

你不使用recusion結果(不要保存'$ a'變量某些地方)。 – Arnial

+0

檢查鏈接:http://avenir.ro/multi-level-unlimited-menu-php-sub-menus/ –

回答

0

要覆蓋所有$return當你調用行$return = array();遞歸函數的時間。所以您應該嘗試使$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。它更具可讀性(對我來說)。

更新:此功能可以很容易地重寫爲迭代功能。迭代函數更容易理解(米的味道),它可能會更好地工作(至少需要更少的內存),然後遞歸。

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; 
}