Удалять дубликаты в коллекции Laravel, только если предыдущий элемент идентичен - PullRequest
0 голосов
/ 28 мая 2020

У меня есть Laravel Коллекция элементов:

[
    [
    'id' => 1,
    'path' => '/',
    'created_at' => '2020-05-20 20:12:00'
    ],
    [
    'id' => 2,
    'path' => '/somewhere',
    'created_at' => '2020-05-20 21:01:00'
    ],
    [
    'id' => 3,
    'path' => '/somewhere',
    'created_at' => '2020-05-20 21:21:00'
    ],
    [
    'id' => 4,
    'path' => '/somewhere/else',
    'created_at' => '2020-05-20 21:09:00'
    ],
    [
    'id' => 5,
    'path' => '/somewhere/else',
    'created_at' => '2020-05-20 21:10:00'
    ],
]

Это необработанные данные, которые можно было бы найти в коллекции, если бы я преобразовал их в массив, но мне нужно, чтобы они оставались в коллекции формат.

Мне нужно удалить все дубликаты, где текущий элемент имеет такое же path и меньше 5 минут по сравнению с предыдущим элементом.

Итак, в этом случае элемент # 4 будет удален, останется только 5, но элементы 2 и 3 останутся, даже если их пути совпадают.

Как мне это сделать?

1 Ответ

0 голосов
/ 28 мая 2020

Используйте следующее пространство имен в вашем файле контроллера:

use DateTime;

Используйте следующий код в вашем файле контроллера:

$collection = [
        [
            'id' => 1,
            'path' => '/',
            'created_at' => '2020-05-20 20:12:00'
        ],
        [
            'id' => 2,
            'path' => '/somewhere',
            'created_at' => '2020-05-20 21:01:00'
        ],
        [
            'id' => 3,
            'path' => '/somewhere',
            'created_at' => '2020-05-20 21:21:00'
        ],
        [
            'id' => 4,
            'path' => '/somewhere/else',
            'created_at' => '2020-05-20 21:09:00'
        ],
        [
            'id' => 5,
            'path' => '/somewhere/else',
            'created_at' => '2020-05-20 21:10:00'
        ],
    ];

    $paths = [];
    $time_count = [];
    foreach ($collection as $key => $data) {

        if (in_array($data['path'], $paths)) {
            $arr_pos = array_search($data['path'], array_values($paths));

            $datetime1 = new DateTime($data['created_at']);
            $datetime2 = new DateTime($collection[$arr_pos]['created_at']);

            $interval = $datetime1->diff($datetime2);
            $mins = $interval->format('%i');
            if ($mins < 5) {
                unset($collection[$arr_pos]);
            }
        }
        $paths[] = $data['path'];
    }

Это вернет результат:

array:4 [▼
     0 => array:3 [▼
       "id" => 1
       "path" => "/"
       "created_at" => "2020-05-20 20:12:00"
      ]
      1 => array:3 [▼
          "id" => 2
          "path" => "/somewhere"
         "created_at" => "2020-05-20 21:01:00"
      ]
      2 => array:3 [▼
         "id" => 3
         "path" => "/somewhere"
         "created_at" => "2020-05-20 21:21:00"
      ]    
      4 => array:3 [▼
        "id" => 5
        "path" => "/somewhere/else"
        "created_at" => "2020-05-20 21:10:00"
      ]
     ]

Надеюсь, это сработает для вас.

...