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

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

ただいまの
回答率

90.03%

それほど高負荷でしょうか???

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 271

Take_it

score 164

月初から今日の二日前までの日付を配列で取得しようとしています。

$config['now'] = new DateTimeImmutable;

function get_day_list($config){
    $day_list = array();
    $ed_date = $config['now']->modify('-2 day')->format('Y-m-d');//2日前
    $st_date = $config['now']->modify('first day of this month')->format('Y-m-d');
    $ed_ob = new DateTimeImmutable($ed_date);
    $st_ob = new DateTime($st_date);

    $stop = 0;
    if($st_ob<$ed_ob):
        while($stop<1):
            $date = $st_ob->format('Y-m-d');
            $day_list[] = $date;
            if($date==$ed_ob):
                ++$stop;
            else:
                $st_ob = $st_ob->modify('+1 day');
            endif;
        endwhile;
    elseif($st_ob==$ed_ob):
        $day_list[]=$st_date;//1日だけ
    else://($st_ob>$ed_ob)
        return;//何もせずに関数を終える。返り値なし。
    endif;

    return $day_list;
}

起きている現象

やけに時間がかかり、

Fatal error: Allowed memory size of 1342177280 bytes exhausted (tried to allocate 4096 bytes) in* * * * * function.php on line 48


となる。
該当する箇所がwhileのところなので無限ループを疑い、$stop=0;の直前でこの二つのDateTimeオブジェクトをチェックしてみたが特に異常はない。

//$st_ob
DateTime Object
(
    [date] => 2019-06-01 00:00:00.000000
    [timezone_type] => 3
    [timezone] => Asia/Tokyo
)

//$ed_ob
DateTimeImmutable Object
(
    [date] => 2019-06-26 00:00:00.000000
    [timezone_type] => 3
    [timezone] => Asia/Tokyo
)


このエラーはどう回避すればよいのでしょうか・・・。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • scsi

    2019/06/28 20:42

    While分の中の変数を標準出力に出してみたらわかるのでは?

    キャンセル

回答 5

checkベストアンサー

+2

$date==$ed_ob がずっと false
$date,$ed_obの推移を確認するといいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/28 20:47

    実際には推移以前の問題ですけど。。。

    キャンセル

  • 2019/06/28 20:50

    while($stop<1):
    $date = $st_ob->format('Y-m-d');
    $day_list[] = $date;
    if($st_ob==$ed_ob):
    ++$stop;
    else:
    $st_ob = $st_ob->modify('+1 day');
    endif;
    endwhile;

    とすべきでした。。

    キャンセル

+2

           if($date==$ed_ob):

文字列とオブジェクトの比較になっているので無限ループしていると思われます。
こうかな。

           if($date==$ed_date):

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんな感じでよいのでは?

$offset=2;
$d1=range(strtotime(date("Y-m-1")),strtotime(date("Y-m-d")),60*60*24);
$d1=array_splice($d1,0,count($d1)>$offset?count($d1)-$offset:0);
$d2=array_map(function($x){return date("Y-m-d",$x);},$d1);
print_r($d2);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/28 20:47 編集

    今日が1日や2日だったときに2日前をどうするか次第ですね
    わざわざ日付の処理をwhileでループする必要もないでしょう。
    m日からn日までをrangeでとってo日前ということなら後ろからo個
    データを削ればよいので

    キャンセル

-1

メモリの増減を追ってみては。

もし大きなデータを保持している変数があるのでしたら用が済んだらunset()するとか、
必要な情報のみを取得するように配慮した方がいいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

バッチなどで利用していると時々出ますね。
Fatal error: Allowed memory size of

メモリーの使用量を計測する事と、下記にて使用量を変更してみては如何でしょうか?

ini_set("memory_limit", "200M");

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る