关于函数递归,无限分类,树出错的一个问题 $newResult = array_merge($newResult,func($row['id'],$queryResult));你那样写的话就把merge后的结果又追加到原来的数组里面了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不建议使用递归关于三个字段无限分类的可以参考http://topic.csdn.net/u/20090311/15/637DE3A0-F2AB-4F5A-BDB2-D2B726F8F6C7.html 和http://topic.csdn.net/u/20090312/19/998C593D-344A-42AE-B263-E9FF293299EE.html 里面我谈到的 3楼给的我有些地方看不懂啊,我想知道如果用我的方法哪里出错了,应该如何修改。$st1 =func(4,$resultArray); //id 4的所有子节点var_dump($st1);+----+--------+------+| id | parent | name |+----+--------+------+| 1 | 0 | 祖父 || 3 | 1 | 叔伯 || 2 | 1 | 父亲 || 7 | 2 | 姐妹 || 4 | 2 | 自己 || 8 | 3 | 表亲 || 5 | 4 | 儿子 || 10 | 4 | 女儿 || 12 | 5 | 孙女 || 6 | 5 | 孙子 || 9 | 7 | 甥儿 || 11 | 10 | 外孙 |+----+--------+------+期望的结果是: 5 | 4 | 儿子 | 12 | 5 | 孙女 || 6 | 5 | 孙子 | 10 | 4 | 女儿 | 11 | 10 | 外孙 是一个一维数组,结果却变成如此,为什么?n维? function func($id,array $queryResult) //入口是一个id值,表示查找所有子节点{ $newResult = array();//存储结果 foreach($queryResult as $num=>$row) { if($row['parent'] == $id) { $newResult[] = $row; $newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/ } } return $newResult;}$newResult[] =XXX使递归的值成了子集,而不并列的值,得到的就不是一维,而是多维数组了 function func($id,array $queryResult) //入口是一个id值,表示查找所有子节点{ $newResult = array();//存储结果 foreach($queryResult as $num=>$row) { if($row['parent'] == $id) { $newResult[] = $row; $newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/ } } return $newResult;} 感谢bingbin1321问题解决。另外问一个问题,是关于效率的。function func($id,array $queryResult) //入口是一个id值,表示查找所有子节点 { $newResult = array();//存储结果 foreach($queryResult as $num=>$row) { if($row['parent'] == $id) { $newResult[] = $row; $newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/ } } return $newResult; }这个函数的参数$queryResult是一个二维数组,那么函数调用时,是通过复制参数的方法传递的,因此,会复制一个$queryResult的二维数组,假如这个数组很大,而递归调用,每次也复制一次,假如有10层,等于复制了10个$queryResult的二维数组,这样消耗空间很大,有没有方法可以不通过参数复制的方法?而是一直用原数组,但是保证结果正确。我想到的是引用。但是每一次进入递归调用前必须把数组的index置前,同时本函数内的index不变。 一楼已经给出答复,怎么当时我没有注意到,晕,看来我被程序调试得头晕脑花了。同时完善一下这个函数:第一,增加一个参数$tag =0表示结果不包括自己,1时包括。第二,我楼上说的考虑效率。第三,增加参数$level,表示搜索深度。 可能吧,但是理解总有一个过程。以我现在的程度,这个不算好不算坏吧,这种算法最起码比计算一次就要向myslq取一次结果的好,这种算法最多向mysql搜索最多等于记录行数的次数,减少数据库压力,是一个进步,但是可能还有更好的算法。但是我暂时不知道,有时间再好好研究一下你给的例子,现在能完工把任务完成就行了。总之,谢谢所有楼上的。我说得:这个函数的参数$queryResult是一个二维数组,那么函数调用时,是通过复制参数的方法传递的,因此,会复制一个$queryResult的二维数组,假如这个数组很大,而递归调用,每次也复制一次,假如有10层,等于复制了10个$queryResult的二维数组,这样消耗空间很大,有没有方法可以不通过参数复制的方法?而是一直用原数组,但是保证结果正确。 我想到的是引用。但是每一次进入递归调用前必须把数组的index置首,同时本函数内的index不变。这个有没有帮忙解决啊。 我这个递归没有每次查询数据库了,一开始就把整个数据读入数组了,操作都是php在内存中操作了。我看过http://bbs.phpchina.com/viewthread.php?tid=80868&extra=&page=1我的这种算法应该比上述的好一些。 我这个递归没有每次查询数据库了,一开始就把整个数据读入数组了,操作都是php在内存中操作了。我看过http://bbs.phpchina.com/viewthread.php?tid=80868&extra=&page=1我的这种算法应该比上述的好一些。 php curl 抓取某网站遇到的问题 忘高手指导一二 php文件打不开、 好久没来这里了! 求教一个PHP换行问题 求一个正则表达式 求一个PHP中不使用在线编辑器而保持textarea 中文本段落的函数 用smarty怎么做定制标签的功能? vss怎么用啊?大家看看连不连的上我。 文本文件操作问题 谁能帮我解释一下这几句,详细点, html的规范? 【帮忙】有PHP项目经验的请进
http://topic.csdn.net/u/20090311/15/637DE3A0-F2AB-4F5A-BDB2-D2B726F8F6C7.html
和
http://topic.csdn.net/u/20090312/19/998C593D-344A-42AE-B263-E9FF293299EE.html
里面我谈到的
$st1 =func(4,$resultArray); //id 4的所有子节点
var_dump($st1);
+----+--------+------+
| id | parent | name |
+----+--------+------+
| 1 | 0 | 祖父 |
| 3 | 1 | 叔伯 |
| 2 | 1 | 父亲 |
| 7 | 2 | 姐妹 |
| 4 | 2 | 自己 |
| 8 | 3 | 表亲 |
| 5 | 4 | 儿子 |
| 10 | 4 | 女儿 |
| 12 | 5 | 孙女 |
| 6 | 5 | 孙子 |
| 9 | 7 | 甥儿 |
| 11 | 10 | 外孙 |
+----+--------+------+
期望的结果是:
5 | 4 | 儿子
| 12 | 5 | 孙女 |
| 6 | 5 | 孙子 |
10 | 4 | 女儿
| 11 | 10 | 外孙
是一个一维数组,结果却变成如此,为什么?n维?
{
$newResult = array();//存储结果
foreach($queryResult as $num=>$row)
{ if($row['parent'] == $id)
{
$newResult[] = $row;
$newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/
}
}
return $newResult;
}
$newResult[] =XXX
使递归的值成了子集,而不并列的值,得到的就不是一维,而是多维数组了
{
$newResult = array();//存储结果
foreach($queryResult as $num=>$row)
{ if($row['parent'] == $id)
{
$newResult[] = $row;
$newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/
}
}
return $newResult;
}
{
$newResult = array();//存储结果
foreach($queryResult as $num=>$row)
{ if($row['parent'] == $id)
{
$newResult[] = $row;
$newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/
}
}
return $newResult;
}这个函数的参数$queryResult是一个二维数组,那么函数调用时,是通过复制参数的方法传递的,因此,会复制一个$queryResult的二维数组,假如这个数组很大,而递归调用,每次也复制一次,假如有10层,等于复制了10个$queryResult的二维数组,这样消耗空间很大,有没有方法可以不通过参数复制的方法?而是一直用原数组,但是保证结果正确。我想到的是引用。但是每一次进入递归调用前必须把数组的index置前,同时本函数内的index不变。
第二,我楼上说的考虑效率。
第三,增加参数$level,表示搜索深度。
这个函数的参数$queryResult是一个二维数组,那么函数调用时,是通过复制参数的方法传递的,因此,会复制一个$queryResult的二维数组,假如这个数组很大,而递归调用,每次也复制一次,假如有10层,等于复制了10个$queryResult的二维数组,这样消耗空间很大,有没有方法可以不通过参数复制的方法?而是一直用原数组,但是保证结果正确。 我想到的是引用。但是每一次进入递归调用前必须把数组的index置首,同时本函数内的index不变。这个有没有帮忙解决啊。
http://bbs.phpchina.com/viewthread.php?tid=80868&extra=&page=1
我的这种算法应该比上述的好一些。
http://bbs.phpchina.com/viewthread.php?tid=80868&extra=&page=1
我的这种算法应该比上述的好一些。