php中的奇怪数组

时间:2010-05-12 08:28:12

标签: php arrays recursion

这里我写了一个函数,它的一般用途是在父根$ depId下得到一个depIds数组。

我使用递归方法来获取数组:

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

虽然我认为它应该返回depid的一维数组。但是当调用时:

$this->getEmpsByDep(0);

当在getEmpsByDep函数中将“return”更改为“var_dump”时,它会返回一个奇怪的2D数组:

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

总之,我怎样才能让1D数组认为这个函数的代码正确?

4 个答案:

答案 0 :(得分:0)

在我看来,每次childnode = true并且新的itteration开始。将创建一个带有新值的新数组...... 但这可能是对我的代码的错误解释:P

答案 1 :(得分: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); 
 } 

答案 2 :(得分: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));

答案 3 :(得分: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);
}