それ以降の日付になる可能性があるn個の日付のリストが与えられた場合、単なるランダムな日付になります。人間が読める適切な文字列を生成するための最良の方法は何ですか。
例を挙げましょう。
2016-02-13, 2016-02-14, 2016-02-15, 2016-02-16
次のように表現する必要があります。
feb 13th "16 - feb 16th "16
日付を人間が読める形式に変換するのは簡単です。私は可能な限り短い解決策に日付の配列を減らすためのある種のアルゴリズムに興味があります。
リストに "holes"が含まれていると、物事が難しくなり始めます。
2016-02-13, 2016-02-14, 2016-02-15, 2016-03-02, 2016-03-03
feb 13th "16 - feb 15th "16 & mar 2nd "16 - mar 3rd "16
私は「これについて私の頭を割ってきました。もう時間です。リストを壊して並べ替え、一意にし、その間の日数を確認し、その中にいくつの要素があるかを確認します。
しかし、「穴」の問題を解決するのは困難です。そして、私の解決策は防水ではありません。
この問題への取り組み方について何か考えはありますか?
回答:
回答№1は0急いで書いたので、特に夏時間の場合は慎重にチェックしてください。主な考え方は、間隔をとる必要があるということです。
<?php
date_default_timezone_set("UTC");
$dates=explode(", ",
"2015-02-13, 2015-02-14, 2015-02-15, 2015-02-16, 2016-02-13, 2016-02-14, 2016-02-15, 2016-03-02, 2016-03-03");
$intervals = Array();
$t0 = -1;
$t = $t0;
if(count($dates))
foreach($dates as $d)
{
$t00 = strtotime("$d -1 day");
if($t != $t00)
{
if($t0 != -1)
{
if($t == $t0)
$intervals[]=date("M jS "y",$t0);
else
$intervals[]=date("M jS "y",$t0) . " - " . date("M jS "y",$t);
}
$t = strtotime($d);
$t0 = $t;
}
else
$t = strtotime($d);
}
if ($t0 != $t)
$intervals[]=date("M jS "y",$t0) . " - " . date("M jS "y",$t);
echo join(" & ", $intervals);
結果:
Feb 13th "15 - Feb 16th "15 & Feb 13th "16 - Feb 15th "16 & Mar 2nd "16 - Mar 3rd "16
回答№2の場合は0
区間を検索するというアイデアを紹介する@ kay27の助けを借りて、これが私が区間のリストを作成する方法です。 これが雄弁なモデル内の方法で、データのリストが $this->data
。そしてCarbonを使って素敵な日付修飾子を作ります。
public function fd($format = "Y-m-d")
{
$dates = [];
$intervals = [];
foreach ($this->data as $d) {
$dates[] = Carbon::parse($d->datum);
}
// sort the dates..
// init
$i=0;
$t=0;
$peil = $dates[$i];
$intervals[$t] = [$peil];
// loop through the dates starting from 0+1, as we already
// "processed" the first entry.
for ($i=1; $i < count($dates); $i++) {
// when not equal; then we will need to create a new inTerval,
// so we increase the index:
if ($peil != $dates[$i]->copy()->subDay()) {
$t++;
}
// adding the date to the appropriate interval.
$intervals[$t][] = $dates[$i];
// the reference date, as-in the last date added to the list.
$peil = $dates[$i];
}
// do some formatting on the intervals
return $intervals;
}