2010-05-12 62 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); 
}