多次找子节点出问题,大家帮看下怎么办?

2014-02-22 11:54:55 +08:00
 kchum
https://gist.github.com/kchum/9148369

项目需要一个action里多次调用getChild,重要的是getChild里还有递归。
错误原因我知道是由于static的缘故,没有释放静态变量的方法。
也试过把static弄成static $children[$id][]=array 二维数组,也不行。

写文件缓存我知道可以,但不想这样操作,有点麻烦

不知道还有什么办法可以解决的呢
非常感谢!
2512 次点击
所在节点    PHP
8 条回复
dongbeta
2014-02-22 12:33:53 +08:00
flag 这个参数是为了做什么呢?
kchum
2014-02-22 12:40:21 +08:00
@dongbeta 返回结果加不加入自身的传值
dongbeta
2014-02-22 12:42:33 +08:00
1. flag 这个参数没有必要,反而混淆你的逻辑。既然是寻找子节点,就没有必要把根节点 ID 加入。
2. 名字错了 应该叫 getChildren
3. 解决递归问题,和解数学上归纳法的思路类似。你先写出一个只给一级子节点的函数,然后再处理子节点的子节点,然后将这两者接上。
4. 如果是为了将值记录下来,可以用传引用参数的方式。static 会在两次调用的时候记忆上一次的值,所以会影响你多次调用。
dongbeta
2014-02-22 12:44:32 +08:00
还有一点,当你发现想不明白的时候,可以尝试去掉一些无关紧要的东西。比如 $idField , $parentField 然后再写。
dongbeta
2014-02-22 12:54:22 +08:00
你的函数会在每一次调用的时候,循环完整的 $source,这样也是不符合效率的。

可以改成这样:

https://gist.github.com/dongbeta/9148950
kchum
2014-02-22 12:55:20 +08:00
@dongbeta 感谢你的建议,flag是为了方便(有时候需要包括自身,有时不需要)。本来1个action里引用getChildren是没有问题的,就是多次引用的时候出错,检查才发现。
我尝试下传引用参数
dongbeta
2014-02-22 12:57:03 +08:00
@kchum 因为需要 unset 已经扫描的记录。所以引用会损伤原始数据。你可以看我在5楼给你贴的例子里面的unset。
kchum
2014-02-22 13:14:56 +08:00
@dongbeta 感谢指导,已解决。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/101344

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX