2010-05-12 61 views
1

這裏我寫了一個函數,它的通用目的是獲得父根下的depId $ depId的數組。在PHP中的奇怪數組

我使用遞歸的方法來獲取數組:

public function getEmpsByDep($depId){ 
    $query = "select * from ".SQLPREFIX."department where id_parent=".$depId; 
    $stmt=$this->db->query($query);  
    while(($row=$this->db->fetch_assoc($stmt))==true) 
    { 
     if($this->hasChildNode($row['DEPID'])) 
     { 
      $depId = $row['DEPID']; 
      self::getEmpsByDep($depId); 
     } 
     else 
     { 
      $arr[]=$row['DEPID']; 
     } 
    } 
    return ($arr); 
} 

這裏是檢查hasChildNode功能如果指定$ DEPID有子部門:

public function hasChildNode($depId) 
{ 
    $query = "select * from ".SQLPREFIX."department where id_parent=".$depId; 
    $stmt=$this->db->query($query); 
    $row=$this->db->fetch_assoc($stmt); 
    if($row==false){ 
     return false; 
    }else 
     return true; 
} 

,而我認爲它應該返回一維數組的電話:

$this->getEmpsByDep(0); 

它返回一個奇怪的二維數組像這樣w母雞變化getEmpsByDep功能「迴歸」到「的var_dump」:

array(4) { 
     [0]=> 
     string(2) "11" 
     [1]=> 
     string(2) "12" 
     [2]=> 
     string(2) "13" 
     [3]=> 
     string(2) "14" 
    } 
    array(3) { 
     [0]=> 
     string(2) "19" 
     [1]=> 
     string(2) "20" 
     [2]=> 
     string(2) "21" 
    } 
    array(3) { 
     [0]=> 
     string(2) "15" 
     [1]=> 
     string(2) "16" 
     [2]=> 
     string(2) "17" 
    } 
    array(8) { 
     [0]=> 
     string(1) "2" 
     [1]=> 
     string(1) "4" 
     [2]=> 
     string(1) "5" 
     [3]=> 
     string(1) "6" 
     [4]=> 
     string(1) "7" 
     [5]=> 
     string(1) "8" 
     [6]=> 
     string(1) "9" 
     [7]=> 
     string(2) "10" 
    } 

這裏是表結構和數據樣本:

$query[]="create table ".$sqltblpre."department(
    depId number(10) not null primary key, 
    depName varchar2(50) not null, 
    id_parent number(10) 
)"; 

//department(部門和崗位) 
$index=1; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'院部',0)"; //1 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'政治部',0)"; //2 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'醫務部',0)"; //3 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'護理部',0)"; //4 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'經濟部',0)"; //5 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'信息科',0)"; //6 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'醫學工程科',0)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'門診系統',0)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'內科系統',0)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'外科系統',0)"; 

$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'院長',1)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'政委',1)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'副院長',1)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'祕書',1)"; 

$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'主任',3)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'副主任',3)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'助理員',3)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'訓練隊',3)"; //18 

$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'隊長',18)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'助理員',18)"; 
$query[] = "INSERT INTO ".$sqltblpre."department values(".$index++.",'隊員',18)"; 

這麼一句話,我怎麼能得到一維數組認爲這個函數的正確的代碼?

+1

太多的代碼,對不起。嘗試縮小它。 – 2010-05-12 08:42:53

+0

@ Lo'oris,我必須對這個問題做一個詳細的解釋,否則恐怕有人無法得到它。 – tunpishuang 2010-05-12 08:46:51

回答

0

您需要合併的陣列,此刻你再次調用你的函數,但拋棄了輸出。看下面這個例子來看看我的意思

<?php 
function recursive($x) { 
    $arr = array(); 
    if ($x == 10) { 
     return $arr; 
    } else { 
     $i = $x; 
     while ($i != 0) { 
      $arr[] = $i; 
      $i = $i - 1; 
     } 

     return array_merge($arr, recursive($x + 1)); 
    } 
} 

$arr = recursive(0); 

var_dump($arr); 

?> 

要解決你的代碼,替代

self::getEmpsByDep($depId); 

隨着

array_merge($arr, self::getEmpsByDep($depId)); 
+0

thx男人,你解決了它....但我仍然不明白爲什麼PHP返回serveral獨立數組,但不是一個單一維數組。你可以更清楚地解釋這一點。 – tunpishuang 2010-05-12 10:47:49

0

在我看來,每次childnode = true並開始新的迭代。這裏將創建與新值的新陣列... 但是,這可能是我的代碼的錯誤解釋:P

+0

也許你猜對了。 – tunpishuang 2010-05-12 10:50:28

0

你可以試試這個

public function getEmpsByDep($depId) 
{ 
    $query = "select * from ".SQLPREFIX."department where id_parent=".$depId; 
    $stmt=$this->db->query($query); 
    $arr = array(); 
    while($row=$this->db->fetch_assoc($stmt)) 
    {  
     if($this->hasChildNode($row['DEPID'])) 
     { 
      $emps = $this->getEmpsByDep($depId); //調用非靜態方法一般不用SELF:: 
      $arr = array_merge($arr, $emps); 
     } 
     else 
     { 
      $arr[]=$row['DEPID']; 
     } 
    } 
    return ($arr); 
} 
+1

其實我之前也試過了$ this的,但是結果一樣。 – tunpishuang 2010-05-12 10:49:47

+0

@ tunpishuang,這只是一個練習筆記,問題在於下一行'$ arr = array_merge($ arr,$ emps); 「或者參考Phill Pafford說的。 – Young 2010-05-13 00:35:07

0

遞歸函數會盡量傳遞$ ARR作爲參考

public function getEmpsByDep($depId, &$arr = array()){ 
    $query = "select * from ".SQLPREFIX."department where id_parent=".$depId; 
    $stmt=$this->db->query($query);  
    while(($row=$this->db->fetch_assoc($stmt))==true) 
    { 
     if($this->hasChildNode($row['DEPID'])) 
     { 
      $depId = $row['DEPID']; 
      self::getEmpsByDep($depId); 
     } 
     else 
     { 
      $arr[]=$row['DEPID']; 
     } 
    } 
    return ($arr); 
}