根据用户和创建时间对php数组项进行分组

根据用户和创建时间对php数组项进行分组,php,algorithm,arrays,grouping,Php,Algorithm,Arrays,Grouping,这是一个显示用户上载照片的对象数组: Array ( [12] => stdClass Object ( [type] => photo [created] => 2010-05-14 23:36:41 [user] => stdClass Object ( [id] => 760

这是一个显示用户上载照片的对象数组:

Array
(
    [12] => stdClass Object
        (
            [type] => photo
            [created] => 2010-05-14 23:36:41
            [user] => stdClass Object
                (
                    [id] => 760
                    [username] => mrsmith
                )

            [photo] => stdClass Object
                (
                    [id] => 4181
                )

        )

    [44] => stdClass Object
        (
            [type] => photo
            [created] => 2010-05-14 23:37:15
            [user] => stdClass Object
                (
                    [id] => 760
                    [username] => mrsmith
                )

            [photo] => stdClass Object
                (
                    [id] => 4180
                )

        )
)
但是,没有显示:

史密斯先生上传了一张照片

史密斯先生上传了一张照片

我想展示:

史密斯先生上传了两张照片 通过对相似的项目进行分组,根据用户ID进行分组,并在每个项目之间添加它们,比如说15分钟。所以我想得到这种形状的数组:

Array
(
    [12] => stdClass Object
        (
            [type] => photo
            [created] => 2010-05-14 23:36:41
            [user] => stdClass Object
                (
                    [id] => 760
                    [username] => mrsmith
                )

            [photos] => Array
                (
                    [0] => stdClass Object
                          (
                           [id] => 4181
                          )

                     [1] => stdClass Object
                          (
                           [id] => 4180
                          )
                )

        )
)
保留组的第一个项目及其创建时间,并用任何其他可分组的照片对其进行补充,然后取消设置分组的任何项目,以便最终数组不再具有键44,因为它与12一起分组

该数组包含除照片以外的其他动作,因此原始键为12和44。我就是想不出一个有效的方法。我曾经使用MySQL和PHP来实现这一点,但出于缓存的原因,我尝试只使用纯PHP


谁能说出一些见解?我想检查每一个项目,看看是否可以将其与阵列中的前一个项目进行分组,但前一个项目可能不一定相关,甚至不一定是一张照片。我的大脑完全冻结了:

如果条目按日期排序,您可以执行以下操作:

保留一个数组,我们称之为$foo,所有的照片都在15分钟的窗口内。将数组用作FIFO列表用于删除项目和$foo[]=。。。加上。 迭代原始数组 检查当前项目的日期,并从$foo开头删除日期比当前项目短15分钟以上的所有条目。一旦你发现一个项目,对于不到15分钟前发生的事情,你可以停止它的一行循环。 迭代$foo中的条目 如果发现同一个人的照片,则 更改$foo中存储的引用,以便添加新数据 从原始数组中删除当前项 从内环中断 如果不是 使用$foo=&$var将对当前项的引用添加到$foo末尾。
然后,您可以使用重新索引原始数组以填补空白。

这是您从数据库获得的数据吗?如果是这样的话,将整个表加载到一个数组中是非常低效的。也许你可以进一步澄清申请?我同意约拿的看法。您是否考虑过简单地缓存MySQL查询的结果?这是一个用户活动流,类似于facebook流。它用于从单独的表中获取活动,并组合成一个统一的对象数组。当然,这是相当低效的,我不能使用限制。所以我打算将所有内容移动到一个活动表中,在这里我可以在一次查询中快速查询活动。问题是,我不能再像以前那样使用MySQL将照片分组在一起了。像这样:id user\u id object\u id type created 1 2 48592 photo 18:18:50 2 2 48593 photo 18:18:51 3 3 2 548592 comment 18:18:55 4 2 48594 photo 18:18:59这只是我的观点,但我认为你给自己带来了很多额外的工作,同时也给自己设置了可伸缩性问题。如果是我,再一次,我的观点是,我会坚持使用MySQL和规范化的表,启动并运行你的应用程序,并开始关注性能改进、查询调优等,在找出xdebug之类的东西可能存在的瓶颈之后。谢谢Jeremy,这就是我面临这个问题的原因,我从标准化的表格开始,随着应用程序越来越受到关注,它导致服务器频繁停机。问题是这些查询和内存使用都集中在一个页面上,而用户和搜索引擎让服务器陷入困境。使用非标准化的活动表运行一些基准测试,这是我从这里的问题中得到的一个想法,虽然它确实会带来更多的麻烦,但表明它速度更快,内存占用更少。