你给出的示例表与函数中的字段无明确对应关系,望改正!表数据:
id pid
1 0
3 1
4 3逆向递归--由子向父查找的一般算法是
founction foo($id) (
$sql = "select pid from tbl_name where id=$id";
$rs = xxx_query($sql);
whild(list($pid) = xxx_fetch_row($rs)) {
return foo($pid);
}
}
id pid
1 0
3 1
4 3逆向递归--由子向父查找的一般算法是
founction foo($id) (
$sql = "select pid from tbl_name where id=$id";
$rs = xxx_query($sql);
whild(list($pid) = xxx_fetch_row($rs)) {
return foo($pid);
}
}
RESOURCE_SORT_PID ==> pid
我简写了一下老大。。
1 如果表不大的话,把整个表预读到数组里要比每次递归查数据库合理的多
2 查找父结点过程中,最好判断可能出现的环
3 一个结点有多个父结点的情况处理仅就你写的函数来说
第一个函数可以改为
function getpid($selfid){
GLOBAL $db;
$sql = "select RESOURCE_SORT_PID from RESOURCE_SORT where RESOURCE_SORT_ID=".$selfid;
$query = $db->query($sql);
$return = '';
while($row = $db->fetch_array($query)){
if($row['RESOURCE_SORT_PID'] > 0){
$return .= empty($return) ? $row['RESOURCE_SORT_PID'] : ','.$row['RESOURCE_SORT_PID'];
$return .= empty($return) ? getpid($row['RESOURCE_SORT_PID']) : ','.getpid($row['RESOURCE_SORT_PID']);
}else{
return $return;
}
}
return $return;
}
示例:
function a(){
some code
a()
other code
}
这个函数中,调用递归后other code是怎么个执行情况?
第一次调用getpid()后,$return值为3,
因为3不空,在递归调用getpid()时将3传给了参数$return,
查询到pid为1,不空,则$return=3,1
再判断$return仍不空,再次递归调用getpid(),$return为3,1
由1查到的pid为0,则返回$return,则第二次调用的$return为3,1,3,1
再返回到第一次调用,加上前面的3,就成了3,3,1,3,1
小弟还是有一些不明白:
-----查询到pid为1,不空,则$return=3,1//此时pid为1,而1的pid为0
-----再判断$return仍不空,再次递归调用getpid(),$return为3,1//这时再次调用getpid()时,
传进的$selfid是不是应该为1?而1的pid为0,到后面的if判断。。
if($row['RESOURCE_SORT_PID'] > 0){
.....
}else{
return $return;
}
是不是应该return了?
而结果应是:3,3,1----- 我分析的哪里出了问题???
1->getpid(4,'')
2->getpid(3,'3')
3->getpid(1,'3,1')返回是倒过来拼起来的
3->return '3,1'
2->return '3,1,3,1'
1->return '3,3,1,3,1'
用了你写的函数。输出结果是:3,1,
当然,,可以用很多种办法把后面的‘,’号过滤掉。。
如果是那样的话,,我开帖的意义就不大了。。我就是想写出一个不需要再处理多余“,”号的函数。。
1 0 A
3 1 B
4 1 C
5 3 D
6 3 E
7 4 F
8 4 G
9 5 H
10 5 I
11 9 J
12 11 K
13 12 L
14 13 M##############################################################################################################################function findsort($id,$rows,$rowk) {
global $db;
if(!empty($id)) {
$sql = "select SortId,SortUid,SortName from InfoSorts where SortId = '$id'";
$query = $db -> query($sql);
while($row = $db -> fetch_array($query)) {
if(empty($rowk)) {
$rowk = $row['SortId'];
}else{
$rowk .= "," . $row['SortId'];
}
$rowa = array($row['SortId'],$row['SortUid'],$row['SortName']);
$rows[] = $rowa;
return findsort($row['SortUid'],$rows,$rowk);
}
}else{
return array($rows,$rowk);
}
}
$as = findsort(14,null,null);
echo("<pre>");
print_r($as[0]);
echo("</pre>");
echo("<br><br>");
echo($as[1]);##############################################################################################################################Array
(
[0] => Array
(
[0] => 14
[1] => 13
[2] => M
) [1] => Array
(
[0] => 13
[1] => 12
[2] => L
) [2] => Array
(
[0] => 12
[1] => 11
[2] => K
) [3] => Array
(
[0] => 11
[1] => 9
[2] => J
) [4] => Array
(
[0] => 9
[1] => 5
[2] => H
) [5] => Array
(
[0] => 5
[1] => 3
[2] => D
) [6] => Array
(
[0] => 3
[1] => 1
[2] => B
) [7] => Array
(
[0] => 1
[1] => 0
[2] => A
))14,13,12,11,9,5,3,1
1->getpid(4,'') $return = 3
2->getpid(3,'3') $return = 3,1
3->getpid(1,'3,1') 到了第三次调用时:$selfid为1,程序执行了else中的return $return..
但是奇怪的是return $return不仅仅只是做了一次把$return这个变量return..我知道我问得有点过份了,但是还是希望有人告诉我这是什么?
以下是我的代码:
$i = 0;
function getpid3($selfid,$return){
GLOBAL $db,$i;
$i++;
$sql = "select RESOURCE_SORT_PID from RESOURCE_SORT where RESOURCE_SORT_ID=".$selfid;
$query = $db->query($sql);
while($row = $db->fetch_array($query)){
if($row['RESOURCE_SORT_PID'] > 0){
if($selfid == 1){
echo '|||||||||||||||||||||||||||||||||<br>';
}
$return .= empty($return) ? $row['RESOURCE_SORT_PID'] : ','.$row['RESOURCE_SORT_PID'];
echo $i.'=='.$selfid.'=='.$return.'***************************************<Br>';
$return .= empty($return) ? getpid3($row['RESOURCE_SORT_PID'],$return) : ','.getpid3($row['RESOURCE_SORT_PID'],$return);
//return getpid3($row['RESOURCE_SORT_PID'],$return);
echo $i.'=='.$selfid.'=='.$return.'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br>';
}else{
if($selfid == 1){
echo '-----------------------------------------<br>';
}
echo $i.'=='.$selfid.'=='.$return.'#############################################<Br>';
return $return;
}
}
return $return;
}
$tid = getpid3($rid,'');
var_dump($tid);
exit;
以下是输出结果:1==4==3***************************************
2==3==3,1***************************************
-----------------------------------------//从这里开始执行else
3==1==3,1#############################################//输出了一次return的值
3==3==3,1,3,1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//这里却执行了if里的语句
3==4==3,3,1,3,1@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//还有这里。
string(9) "3,3,1,3,1" '=='最左面是循环的次数,中间是$selfid,最后是$return的值谁能告诉我为什么这样。??????
打开关闭数据库的代码我省了,得到一个数据库记录ID记为变量$id
if($id=0){
echo "最终ID为".$id;
}else{
echo "这里是一个父ID".$id.">";
getpid($id);
}
}
里面输出的地方也可以用变量替换
连接数据库的部分,请大家自行替换,我的问题是我无法返回,代码如下:
<?php
include("OP_DB.php"); $db=new OP_DB(); $db->connect_db('localhost','root','dreambird','test'); function digui($id,$vv)
{ $query="select pid from test where id=".$id; //echo $query;
$result=mysql_query($query); $row=mysql_fetch_array($result); if($row[pid]!=0)
{
$vv.=$id;
digui($row[pid],$vv);
} else
{
$vv.=$id;
//echo $vv;在此处可以得到正常的序列
return $vv;
}
} echo digui(4,'');return后,在此处得到的值是空,为什么啊??>
{
$vv.=$id;
return digui($row[pid],$vv);
}