【问题标题】:Need a better, less memory intensive way to organize an unnested parent->child array需要一种更好、内存占用更少的方法来组织未嵌套的父->子数组
【发布时间】:2010-11-25 13:49:08
【问题描述】:

我一直在使用我第一次开始编程时(或至少在此后不久)创建的一个函数来执行简单但非常有用的任务,即根据父母和孩子组织一个数组。例如,如果您有一个可以在数据库中具有无限深度的子项的项目列表,并且您需要在具有视觉效果的 html 选择元素中按顺序显示该列表,那么这将很有用。每个孩子的深度表示 (--)。

现在,我有执行此操作的函数,它们可以在我放入它们的所有情况下工作,但是它们无数次克隆数组......到目前为止,这还不是问题,但我开始在可能需要组织数万个条目的地方使用此功能。所以我希望这里有人可以帮助我优化它。

代码:http://pastebin.com/knk0Fyd0

【问题讨论】:

    标签: php arrays hierarchy hierarchical-data


    【解决方案1】:

    count() 函数从循环中取出。这是一个瓶颈。而不是:

    for ($i=0;$i<count($array);$i++)
    

    使用这个:

    $count=count($array);
    for ($i=0;$i<$count;$i++)
    

    您的InsertAfter() 函数可以使用PHP 的array_splice() 和/或array_slice() 轻松完成。

    【讨论】:

    • 谢谢,这是一个相当显着的速度提升,但我很好奇......我是一次又一次地将数组加载到内存中,还是 PHP 足够聪明以正确处理它?
    • 您正在操作函数内部的数组。当你的函数完成后,PHP 的垃圾收集器接管并释放空间。如果你能把这个大函数分解成更小的函数,你的内存消耗就会下降。
    • 好的,非常感谢...另外我只是在一个随机生成的 200 条目长数组上运行它,它需要 2ms 才能运行。有没有其他方法可以加快速度?或者,有没有办法缓存一个数组?我构建了一个缓存函数,但我不确定如何为每个数组获取一个唯一 ID,以确保尚未生成它的缓存。 md5(var_dump())?
    • @Jon 听起来您正在使用邻接列表方法来存储数据(例如,每条记录的 id 和 parentId)。如果读取性能是主要问题,并且您使用 RDBMS 进行持久性,请考虑此处列出的其他一些选项:stackoverflow.com/questions/4048151/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2011-03-27
    相关资源
    最近更新 更多