php - 如果数组列表对象的日期(属性)相对于任何其他对象日期在 15 天内,则删除该对象

标签 php arrays

我会澄清我的问题。

我有对象的数组列表,其中它的属性之一是日期。我想要一个对象列表,其中数组中每个对象之间的最小间隔为 15 天。

    {
        "id": 1,
        "date" : "21-04-2017",
        "report" : "Temp",
        "Test" : "7500000"
    }
    {
        "id": 2,
        "dateReported" : "29-03-2017",
        "report" : "Temp",
        "Test" : "7500000"
    }, 
    {
        "id": 3,
        "dateReported" : "29-03-2017",
        "report" : "Temp",
        "Test" : "7500000"
    }, 
    {
        "id": 4,
        "dateReported" : "23-03-2017",
        "report" : "Temp",
        "Test" : "7500000"
    }, 
    {
        "id": 5,
        "dateReported" : "02-02-2017",
        "report" : "Temp",
        "Test" : "7500000"
    }, 
    {
        "id": 6,
        "dateReported" : "01-02-2017",
        "report" : "Temp",
        "Test" : "7500000"
    }`

在上面的列表中,对象 id: 1, 2, 5 必须是结果,因为例如对象 id: 3 是在对象 id: 2 的 15 天内,类似地 id: 4 和对象 id:6 是在 15 天内对象 ID:5。

我编写了以下代码,我可以在循环中删除对象 id:3 和 6,但无法删除对象 id:4,它也在对象 id:2 的 15 天内

以下是我尝试过的php代码:

$finalFilteredList = [];
// Filter out array objects, if any array objects have dates with in 15 days.
for ($index = 0, $j = 0; $index < count($intermediateList); $index++) {
    $counter = $index + 1;
    if (isset($intermediateList[$counter])) {
        // Find the difference between counter date and index date.
        $diffTimePeriod = date_diff(date_create($intermediateList[$counter]['date']), date_create($intermediateList[$index]['date']));
        $diffInDays = $diffTimePeriod->format('%d') + (30 * $diffTimePeriod->format('%m')) + (360 * $diffTimePeriod->format('%y'));
        if ($diffInDays < 15) {
            // Considering as duplicate entry and hence ignoring.
        } else {
            $finalFilteredList[$j] = $intermediateList[$index];
            $j++;
        }
    }
}

我相信必须对数组进行排序才能使上面的代码正常工作,并且我假设它现在已排序(以降低复杂性)。

最佳答案

如果您的列表已按日期排序,则如下所示的内容可能更具可读性:

$sortedList = [...your sorted list...];
$filteredList = [];
$firstItem = array_shift($sortedList);
$filteredList[] = $firstItem;
$currentDate = DateTime::createFromFormat('d-m-Y', $firstItem['dateReported']);

foreach($sortedList as $item){

    $nextDate = DateTime::createFromFormat('d-m-Y', $item['dateReported']);
    $interval = $currentDate->diff($nextDate);

    if($interval->days < 15){ continue;}

    $currentDate = $nextDate;
    $filteredList[] = $item;

}

关于php - 如果数组列表对象的日期(属性)相对于任何其他对象日期在 15 天内,则删除该对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44457902/

相关文章:

php - 由数字加密的字母短组合

javascript - 如何使用 jQuery 将多个 GET 放入一个数组中

javascript - 如何按指定规则乘以对象?

iOS Swift : how to check if Object exists in an Array so I don't add it to it, 或用它重新创建 GMSMarker?

php - 通过 php 提交框运行多个 Mysql 更新

php - 这种条件检查是否矫枉过正?

php - laravel 将行插入 mysql 表会导致插入重复行

javascript - bootstrap jquery文件上传和laravel

arrays - 我需要使用数组将数据从 UITableViewController 传递到 UIViewController

php - 如何在重新编号数字键时从数组中删除值