Группировка элементов массива php в зависимости от пользователя и времени создания - PullRequest
0 голосов
/ 15 мая 2010

Это массив объектов, показывающий, что пользователь загружает фотографии:

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
                )

        )
)

Однако вместо отображения:

  • Мистер Смит загрузил одну фотографию

  • мистер Смит загрузил одну фотографию

Я хотел бы отобразить:

  • мистер Смит загрузил две фотографии

, сгруппировав похожие элементы, сгруппировав их по идентификатору пользователя и добавив их в течение, скажем, 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 и 44. Я просто не могу найти способ сделать это эффективно. Я использовал MySQL и PHP, чтобы сделать это, но я пытаюсь просто использовать чистый PHP для кеширования.

Может кто-нибудь пролить какие-либо идеи? Я думал о том, чтобы пройтись по каждому элементу и посмотреть, смогу ли я сгруппировать его с предыдущим в массиве, но предыдущий не обязательно будет релевантным или даже фотография. У меня полная остановка мозга: (

1 Ответ

1 голос
/ 15 мая 2010

Если записи упорядочены по дате, вы можете сделать следующее:

  • Храните массив (назовем его $foo) со всеми фотографиями в 15-минутном окне. Используйте массив в качестве списка FIFO (используйте <a href="http://www.php.net/array_shift" rel="nofollow noreferrer">array_shift</a> для удаления элементов и $foo[] = ... для добавления).
  • Перебрать исходный массив
    • Проверьте дату текущего элемента и удалите с начала $foo все записи, чья дата более чем на 15 минут меньше текущего элемента. Как только вы найдете предмет, который произошел менее 15 минут назад, вы можете остановиться (это одна строка для цикла).
    • Перебирать записи в $foo
    • Если фотография того же человека найдена, то
      • Измените ссылку, сохраненную в $foo, чтобы добавить новые данные
      • Удалить текущий элемент из исходного массива
      • разрыв от внутренней петли
    • Если нет
      • Добавить ссылку на текущий элемент в конец $foo с $foo = &$var.

Затем вы можете переиндексировать исходный массив с помощью array_values ​​ для заполнения пробелов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...