2017-06-09 8 views
1

私の質問を明確にします。配列リストオブジェクトの日付(プロパティ)が他のオブジェクト日付の15日以内であれば削除します

私はオブジェクトの配列リストを持っています。そのプロパティの1つは日付です。配列の各オブジェクト間の最小間隔が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の15日以内である:2と同様にID:4とオブジェクトID: 6はオブジェクトID:15の15日以内です。

私はオブジェクトIDを削除することができています次のコードを書かれている:ループ内の3及び6が、私は、オブジェクトIDを削除することができません:4オブジェクトIDの15日以内にもある:2

$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++; 
     } 
    } 
} 

私は上記のコードが動作するようにと、私はそれが今のソートされていると仮定するために、配列をソートする必要があると考えている(複雑さを軽減するために):以下の

は、私が試したPHPコードです。

答えて

1

をあなたのリストがすでに日付でソートされている場合は、以下のようなものが読みやすくできます。

$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; 

} 
1

これを試してみてください:

$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); 

Check Code Snippet

+0

素晴らしい答えBhaskerを。返信ありがとうございます。私はGlennCavarleをそのシンプルさの答えとしてマークしました。しかし、私は非常に感謝しています。私の論理を継続して理解し、作業コードへのリンクを提供することを嬉しく思います。 –