views:

92

answers:

4

here i wrote a function , it's general purpose is to get an array of the depIds under the parent root $depId.

i use recursion method to get the array:

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

here is hasChildNode function to check if specified $depId has child department:

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

while i think it should return a 1D array of the depid.but when calls:

$this->getEmpsByDep(0);

it return a strange 2D array like this when change "return" to "var_dump" in getEmpsByDep function:

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

here is the table structure and data sample:

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

so in a word, how can i get the 1D array thought the right code of this function?

A: 

It seems to me that everytime the childnode = true and a new itteration starts. There will be created a new array with new values... But that could be a wrong interpretation of the code of me :P

Bloeper
@Bloeper maybe u guess it right.
tunpishuang
A: 

You may try this

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); 
 } 
SpawnCxy
@SpawnCxy 其实我之前也尝试了$this的,但是结果一样。
tunpishuang
@tunpishuang,this is just a practice note,the problem is the next line,`$arr = array_merge($arr, $emps); ` or do the reference as Phill Pafford said.
SpawnCxy
A: 

You need to merge your arrays, at the moment you're calling your function again but tossing away the output. Look at this example to see what I mean

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

?>

To fix your code, replace

self::getEmpsByDep($depId);

With

array_merge($arr, self::getEmpsByDep($depId));
Alex
@Alex thx man, you solved it....but still i don't quiet understand why PHP returns serveral independent array but not a single dimension array.can u explan this more clearly.
tunpishuang
A: 

For recursive functions try passing the $arr as a reference

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);
}
Phill Pafford