質問: array_replace($data[0] , date("G:i" , strtotime( $data[0] . " +1 day" ) ) );//翌日に変更(??) } array_replace とかで配列を書き換え?と色々試しましたが、書き方がよくわかりません。 お忙しいところ恐縮ですが宜しくお願い致します。 #本当は時刻表っぽく ↓こんな感じにしてみたいところです...。急行なら赤とか。 **17**|39 43 53 **18**|00 11
回答: 方向 `strtotime()`に与える引数にどうにかして正しい日付の情報を与えてあげれば解決します。 具体的には、次の日と判定された場合、引数に `+1 day`が追加されるようにします。 ``` //こんな感じにすると、実行している日の次の日の0:01のunixタイムスタンプが取得出来る $time = strtotime("0:01 +1 day"); ``` 原理 まず `if (strtotime($data[0]) >= $myTime){` が何を意味しているかを理解する必要があります。 strtotimeをPHPマニュアルで確認すると、 `strtotime — 英文形式の日付を Unix タイムスタンプに変換する` という関数です。 コード中で渡されている`$data[0]`は例えば `5:17`だったり、`0:48`だったりして、日付に関する情報が含まれていません。 この場合、省略された日付に関しては本日の日付であると解釈され、 `0:48`を渡された場合、`本日の0:48のUnixタイムスタンプ`が取得されます。 一方で、`$myTime = strtotime ("now");`では現在日時のUnixタイムスタンプが取得されます。 結果として23時に実行した場合、 `if (本日の0:48のunixタイムスタンプ >= 本日の23:00のUnixタイムスタンプ){` という絶対に成立しない条件が作られてしまうため、日付が変わると表示されなくなります。 正しい日付を得るには? CSVのフォーマットが質問にある通りに厳守されている * 先頭行に始発が記録されている * 最終行に終電が記録されている という事であれば、 `始発より早い時刻は全て日付変更後の時刻である` という事がいえるはずです。 であれば、こんな感じで条件を加えてあげて、日付変更後の時間に" +1 day"を付与してあげれば動くはずです。(現在のコードと比較して、どう変わっているか確認してみて下さい。) ``` \n"; $firstTime = null; $j = 0; while ( ( $data = fgetcsv ( $handle, 200, ",", '"' ) ) !== FALSE ) { //ここで初回のループの時だけ始発の時間を変数に格納しておく if(is_null($firstTime) === true){ $firstTime = $data[0]; } //始発より時間が早いかどうか判定 if(strtotime($data[0]) < strtotime($firstTime)){ $time = $data[0]." +1 day"; }else{ $time = $data[0]; } if (strtotime($time) >= $myTime){ $j++; if ($j > 5 ){ //直近の5件のみ表示 break ; } echo "\t\n"; $count = count( $data ); for ( $i = 0; $i < $count; $i++ ) { echo "\t\t{$data[$i]}\n"; } echo "\t\n"; } } echo "\n"; fclose ( $handle ); } ```