我会澄清我的问题。
我有对象的数组列表,其中它的属性之一是日期。我想要一个对象列表,其中数组中的每个对象之间至少有 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 在对象 id:5 的 15 天内。
我编写了以下代码,我可以在循环中删除对象 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;
}
试试这个:
$jsonStr = '[{
"id": "1",
"dateReported" : "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"
}]';
$intermediateList = json_decode($jsonStr);
$finalFilteredList = array();
for ($index = 0, $j = 0; $index < count($intermediateList); $index++) {
$counter = $index + 1;
if (isset($intermediateList[$counter])) {
$datediff = strtotime($intermediateList[$index]->dateReported) - strtotime($intermediateList[$counter]->dateReported);
$datediffInDays = floor($datediff / (60 * 60 * 24));
if($datediffInDays >= 15){
if(empty($finalFilteredList)){
$finalFilteredList[] = $intermediateList[$index];
$finalFilteredList[] = $intermediateList[$counter];
}else{
$finalFilteredList[] = $intermediateList[$counter];
}
}
}
}
echo "<pre>";
print_r($finalFilteredList);
检查代码片段