2016-07-10 9 views
0

私はphpとcodeigniterの初心者です。PHPマイナス1週間日曜日

私は自転車に乗った週のキロの合計のチャートのx軸にラベルを付けるために使用される関数を持っています。それは、今日の日付から、日曜日の0日か、1,2,3などの配列を渡したものとしてカウントダウンすることによって動作します(または動作するはずです)。

は、私はPHPバージョン5.6.19を使用していますが、これは私のコードです:モデルで

:コントローラで

public function week_start($date, $counter){ 
     $tstring = strtotime($date); 
     $wknumber = ($counter + 1); 
     $start = strtotime("-$wknumber weeks sunday", $tstring); 
    return array(date('M d', $start));} 

:ビューで

$datenumbers = array(0, 1, 2, 3, 4, 5, 6, 7); 
$dateResult = $this->bike_model->week_start(date("Y/m/d"), $datenumber); 

  for ($i = 0; $i < 8; $i++){ 
      echo "<text class = \"axis\" y = \"357\" x = \""; 
      echo 26 + ($i*70); 
      echo "\" dy = \".35em\">"; 
      echo $dates_for_table[$i];} 

私はそれを持っていました数日間、それは持っている必要がありますように私はx-axisに最初の番号として7月3日日曜日を示しています。しかし、今日、それは日曜日であり、私は今7月10日の日曜日を私の最近の週と言うことを期待しています。しかし、それは最後の日曜日をまだ見せている!

私の質問は、ここにバグがあるのか​​、私は「1週間の日曜日」がうまくいくのかと誤解していますか?

私の目標は、引数として私の関数を0にすることです。これは、最近の週の開始を返します。それは、日曜日の場合は現在の日曜日か過去の日曜日の場合です。私は日曜日かどうかをチェックする関数にif elseを追加して回避策を見つけました。

if ($tstring == strtotime('this Sunday')){ 
    $wknumber = $counter;} 

else{ 
$wknumber = ($counter + 1);} 

しかし、これは気難しいと感じ、私はよりエレガントな方法を探しています。私はまた、それがどのように機能しているかを理解していると思っていたので、「日曜日の一週間」に何が間違っていたのか理解したい。

ありがとうございました!ここで

+0

私はあなたの古いコードは '$開始=(日付(「W」、$のtstringを)持っていた参照== 0)? $ tstring:strtotime( 'last sunday'、$ tstring); '。それはあなたの問題を解決していませんでしたか? – codisfy

+0

そのコードは私が試したものでしたが、それは私の現在の日曜日にx軸全体に渡って終了しました。私は実装する方法をもっと考えさせるために、そのコードをモデルのノートに入れました。 – Cyclist

+0

私はその代替コードをもう一度試しました。基本的に、問題は日曜日かどうかをチェックしていて、アレイのすべての値について今日の日付を返すかどうかでした。私が軸上の各点で1週間早く取得できると思う唯一の方法は、元の質問の最後にあるif/else文でした。私は今週の " - $ i週間の日"が正確に何をしているかについてはっきりしていないので、私のコードは今*働いているように見えますが、この質問を開いたままにしておきます。日曜日以外の毎日前の日曜日を与えますか?その場合、それはあなたに現在の日曜日を与えますか? – Cyclist

答えて

0

は、私は、オブジェクト指向のDateTimeスタイルを使用して、同様の何かをしたかである:

$startDate = new DateTime('NOW'); // can pass date string if not today 

# reset start date to last Sunday or today if it is Sunday: 
$startDate->sub(new DateInterval('P'.($startDate->format('w')).'D')); 

# for debugging, output first Sunday: 
echo $startDate->format('Y-m-d H:i:s') . " => full date and time (check for timezone issues) \n\n"; 

$weeks = 8; 
for ($i = 0; $i < $weeks; $i++) { 
    # don't decrement first pass; sub 1 week on subsequent: 
    $startDate->sub(new DateInterval('P'. (($i) ? 1 : 0) .'W')); 
    echo $startDate->format('Y-m-d') . "\n"; 
}; 

あなたがあなたの目的のために適応させることができるはずです。

あなたは空想を取得したい場合、あなたはまた、代わりにループ内subを使用してのDatePeriodを使用することができます。

$period = new DatePeriod(
    $startDate, 
    DateInterval::createFromDateString('-1 week'), 
    7 
); 
foreach ($period as $date) { 
    echo $date->format('Y-m-d') . "\n"; 
} 
+0

コード@ldgありがとうございます。それは私のグラフのいくつかのために非常に有望に見えます。しかし、初心者である私は、オブジェクト指向のDate Timeスタイルを理解していません。新しい日時と新しいDateIntervalを指定するとどういう意味ですか?私は[PHPマニュアル](http://php.net/manual/en/datetime.construct.php)でこれを見ていましたが、それを理解できませんでした。私は今フランスにいますので、就寝する必要がありますが、朝に私の脳をこの周りに包み込むことができるかどうかがわかります。ありがとうございました! – Cyclist

+0

@Cyclist手続き型のスタイルに非常によく似ています。http://php.net/manual/en/class.datetime.phpとhttp://www.phptherightway.com/#date_and_timeを参照してください。 – ldg

+0

ありがとう! PHPの正しい方法のサイトは非常にはっきりと書かれています...私は以前にそこにいなかったので、それに感謝します。そして、DatePeriodの追加のアイデアをありがとう。私のプロジェクトには多くの期間が含まれているので、これとオリジナルの関数は非常に便利です。 – Cyclist

関連する問題