Я уточню свой вопрос.
У меня есть список массивов объектов, где одним из его свойств является дата. Я хочу список объектов, где их минимальный разрыв составляет 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" }`
В приведенном выше списке Идентификатор объекта: 1, 2, 5 должен быть результатом, потому что, например, идентификатор объекта: 3 находится в течение 15 дней с идентификатора объекта: 2 и аналогично id: 4 и id объекта: 6 находится в пределах 15 дней от идентификатора объекта : 5.
Я написал следующий код, где я могу удалить идентификатор объекта: 3 и 6 в цикле, но я не могу удалить идентификатор объекта: 4, который также находится в течение 15 дней с идентификатора объекта: 2
Ниже приведен код 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('dm-Y', $firstItem['dateReported']); foreach($sortedList as $item){ $nextDate = DateTime::createFromFormat('dm-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);
Проверить фрагмент кода