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

时间:2010-05-15 16:29:40

标签: php algorithm arrays grouping

这是一组显示用户上传照片的对象:

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来缓存。

任何人都可以提出任何见解吗?我考虑过浏览每个项目,看看我是否可以将它与数组中的前一个项目分组,但前一个可能不一定是相关的,甚至不是照片。我的全脑冻结了:(

1 个答案:

答案 0 :(得分:1)

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

  • 在15分钟的窗口中保留一个数组(让我们称之为$foo)和所有照片。将数组用作FIFO列表(使用array_shift删除项目并$foo[] = ...添加)。
  • 迭代原始数组
    • 检查当前项目的日期,并从$foo的开头删除所有日期比当前项目少15分钟以上的条目。一旦你发现一件物品发生在不到15分钟前发生的事情,你就可以停下来(这是一行换行)。
    • $foo
    • 中的条目进行迭代
    • 如果找到同一个人的照片,那么
      • 更改$foo中存储的引用,以便添加新数据
      • 从原始数组中删除当前项目
      • 从内循环中断
    • 如果没有
      • 使用$foo将当前项目的引用添加到结尾$foo = &$var

然后,您可以使用array_values重新索引原始数组,以填补空白。