V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kchum
V2EX  ›  PHP

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

  •  
  •   kchum · 2014-02-22 11:54:55 +08:00 · 2495 次点击
    这是一个创建于 3687 天前的主题,其中的信息可能已经有所发展或是发生改变。


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

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

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

    可以改成这样:

    https://gist.github.com/dongbeta/9148950
    kchum
        6
    kchum  
    OP
       2014-02-22 12:55:20 +08:00
    @dongbeta 感谢你的建议,flag是为了方便(有时候需要包括自身,有时不需要)。本来1个action里引用getChildren是没有问题的,就是多次引用的时候出错,检查才发现。
    我尝试下传引用参数
    dongbeta
        7
    dongbeta  
       2014-02-22 12:57:03 +08:00
    @kchum 因为需要 unset 已经扫描的记录。所以引用会损伤原始数据。你可以看我在5楼给你贴的例子里面的unset。
    kchum
        8
    kchum  
    OP
       2014-02-22 13:14:56 +08:00
    @dongbeta 感谢指导,已解决。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1178 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 23:05 · PVG 07:05 · LAX 16:05 · JFK 19:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.