strange array in php
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]=>
stri开发者_开发百科ng(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?
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));
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
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);
}
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);
}
精彩评论