質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1712閲覧

[php]do-whileで最後の値までループされない

cray123

総合スコア47

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/08/07 11:23

phpで指定範囲の中に土日があった場合配列で結果を返すコードを作成したのですが、while文が$to_date(2020-08-09)までループしてくれません。
ものすごい基本的なことで恐縮ですが、ご回答よろしくお願いします。

試したコード

php

1 2$from_date = "2020-08-01"; 3$to_date = "2020-08-09"; 4 5$holiday = array(); 6do{ 7 $datetime = new DateTime($from_date); 8 if ((int)$datetime->format('w') == 0 || (int)$datetime->format('w') == 6){ 9 // 土日の場合 10 array_push($holiday, $from_date); 11 } 12 // 指定範囲が同日だった場合は回避 13 if ($from_date < $to_date) { 14 $from_date = date("Y-m-d", strtotime($from_date . "+1 day")); 15 } 16}while ($from_date < $to_date); 17 18var_dump($holiday); 19 20// 結果 21array(3) { 22 [0]=> 23 string(10) "2020-08-01" 24 [1]=> 25 string(10) "2020-08-02" 26 [2]=> 27 string(10) "2020-08-08" 28} 29 30// 期待する結果 31array(3) { 32 [0]=> 33 string(10) "2020-08-01" 34 [1]=> 35 string(10) "2020-08-02" 36 [2]=> 37 string(10) "2020-08-08" 38 [3]=> 39 string(10) "2020-08-09" 40} 41

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

PHP

1$from_date = "2020-08-01"; 2$to_date = "2020-08-09"; 3$holiday=array_map(function($x){ 4 return date("Y-m-d",$x); 5},array_filter(range(strtotime($from_date),strtotime($to_date),60*60*24),function($x){ 6 return in_array(date("w",$x),[0,6]); 7})); 8print_r($holiday);

投稿2020/08/07 12:07

yambejp

総合スコア115001

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray123

2020/08/07 12:11

ご回答ありがとうございます。 参考にさせていただきます。
guest

0

ベストアンサー

$from_dateを翌日に動かしてからwhile ($from_date < $to_date);の条件チェックが入るので、最後に$from_date == $to_dateとなったときにはそのままループを抜けてしまい、次のループは実行されません。

投稿2020/08/07 11:26

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cray123

2020/08/07 12:11

ご回答ありがとうございます。 do-whileでは難しいのでしょうか。できればforかdo-while でいきたいのですが。。。
maisumakun

2020/08/07 12:15

単純に、while ($from_date <= $to_date);とする、では不満でしょうか?
cray123

2020/08/07 12:37 編集

一応質問する前からやったことはありますが、以下のエラーメッセージが出力されてあきらめていました。。。 PHP Fatal error: Allowed memory size of 1047527424 bytes exhausted (tried to allocate 1073741832 bytes) php.iniのメモリーリミットはなるべくあげたくないのですが、難しいでしょうか。(現在999Mです)
maisumakun

2020/08/07 12:39

すみません、今度は$from_dateを動かすときのifの条件が不要ですね。
cray123

2020/08/07 12:41

ああ! そりゃあメモリ不足になるわけですね。。。 こんなことも気づかないなんて。。。 ありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問