2SIMPLE

我们已经回来

一个技术问题:PHP、Recursion、AJAX

运行环境是PHP。需求是,在一棵无限级树的任何一个节点,生成整个树形结构,并标明该节点所在位置。

用递归是最简单的做法,这里的问题是,Recursion是一个一边运算,一边输出结果的过程,不能像select语句那样一次性输出结果,而AJAX要求后台程序一次性返回一个完整的XML数据单元,两边搭配不起来。

求解,变通的办法也可以接受。

Written by Datou

七月 16th, 2006 at 10:19 上午

13 Responses to '一个技术问题:PHP、Recursion、AJAX'

Subscribe to comments with RSS or TrackBack to '一个技术问题:PHP、Recursion、AJAX'.

  1. 我不是很明白“一边运算,一边输出结果”的意思。的确递归是个不断运行的过程,但是在运算过程中没有必要直接把结果输出到客户端阿。运算结果放到一个字符串里,在递归结束后输出不就可以了么?

    cobalt

    2006/07/16 11:00

  2. 问题是调用后台递归的时候,没有办法预测什么时候递归会结束,递归过程中产生的中间结果存放在哪里,在结束的时候如何一次性返回给browser?

    Datou

    2006/07/16 11:45

  3. 递归自己会处理“什么时候会结束”的问题啊。

    cobalt

    2006/07/16 12:05

  4. 不能使用全局变量来保存结果吗?

    xorms

    2006/07/16 13:27

  5. php?试试看output buffering行不行。具体看ob_start()函数的文档。
    感觉你好像把事情想复杂了

    kraml

    2006/07/16 16:02

  6. ob_start会影响全局,动静太大,暂时不考虑

    Datou

    2006/07/16 22:07

  7. 而AJAX要求后台程序一次性返回一个完整的XML数据单元?

    恐怕很难吧

    鲤鱼

    2006/07/16 23:33

  8. "问题是调用后台递归的时候,没有办法预测什么时候递归会结束" ,
    这句话比较费解…
    理论上来说递归只是算法的内部实现,对于外部调用来说,方法返回的时候就是递归结束的时候了。
    对于生成目录树来说,每次递归的结果都是返回一个递归节点的字符串,当递归方法调用结束的时候,最终的返回值应该就是一个完整的字符串了。
    如果说你希望用临时空间来保存中间结果,采用临时文件或者数据库的临时表应该都可以吧?

    zeal

    2006/07/17 12:34

  9. 这个问题要放到php环境下面来讲,用c或者其他语言能够做到,这点很清楚,但是php对递归的支持很有限

    Datou

    2006/07/17 16:19

  10. 这个问题撞过:

    <?
    function Test()
    {
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
    Test ();
    }
    }

    Test();
    ?>

    输出结果是:12345678910

    但要把这个结果存在一个变量里,好象就难了…

    didu

    2006/07/17 21:38

  11. 我觉得这个不是递归的问题,也不是PHP的问题,

    而是你的源数据在哪?在 DB 里面还是在文本里面?

    但是如果是实时的解决方案,恐怕递归出来,性能吃不消啊。

    鲤鱼

    2006/07/17 22:42

  12. 实时的一次性递归出来一棵无限级的树… (._.!)

    如果访问量上去的话,就麻烦了。因为不可比避免的面临一个冲突,人多,那么数据就多,那么你要 Cache 的周期就必须加长,但是人多,Cache 周期长,又不能够很好的满足用户的体验了。。。

    鲤鱼

    2006/07/17 22:47

  13. 理论上无限级,实际上一般三四级,多的七八级。

    Datou

    2006/07/17 23:08

Leave a Reply