这里我写了一个函数,它的一般用途是在父根$ 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数组认为这个函数的代码正确?
答案 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);
}