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

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

ただいまの
回答率

87.59%

PHPで3/1〜3/31の大小を分岐させたい

解決済

回答 4

投稿 編集

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

score 5

PHP7で、つまらない質問です。
ご回答いただけると助かります。

3/1〜3/31という日程の文字列が4つずつあります。合計124です。
これをfor文で大小区別しようとすると、思うように分岐できません。
3/1という文字列は、3÷1という計算になってしまうのでしょうか?

やりたい事としては本日(投稿日3/14)以前か、どうかの値を分岐したいです。
例: 3/13は3/14より小さいので出力しない

date()

<?php

    $TODAY = date("n/d");
    $COM_LIST = array(

        "3/1",
        "3/1",
        "3/1",
        "3/1",
        "3/2",
        "3/2",
        "3/2",
        "3/2",
        "3/3",
        "3/3",
        "3/3",
        "3/3",
        "3/4",
        "3/4",
        "3/4",
        "3/4",
        "3/5",
        "3/5",
        "3/5",
        "3/5",
        "3/6",
        "3/6",
        "3/6",
        "3/6",
        "3/7",
        "3/7",
        "3/7",
        "3/7",
        "3/8",
        "3/8",
        "3/8",
        "3/8",
        "3/9",
        "3/9",
        "3/9",
        "3/9",
        "3/10",
        "3/10",
        "3/10",
        "3/10",
        "3/11",
        "3/11",
        "3/11",
        "3/11",
        "3/12",
        "3/12",
        "3/12",
        "3/12",
        "3/13",
        "3/13",
        "3/13",
        "3/13",
        "3/14",
        "3/14",
        "3/14",
        "3/14",
        "3/15",
        "3/15",
        "3/15",
        "3/15",
        "3/16",
        "3/16",
        "3/16",
        "3/16",
        "3/17",
        "3/17",
        "3/17",
        "3/17",
        "3/18",
        "3/18",
        "3/18",
        "3/18",
        "3/19",
        "3/19",
        "3/19",
        "3/19",
        "3/20",
        "3/20",
        "3/20",
        "3/20",
        "3/21",
        "3/21",
        "3/21",
        "3/21",
        "3/22",
        "3/22",
        "3/22",
        "3/22",
        "3/23",
        "3/23",
        "3/23",
        "3/23",
        "3/24",
        "3/24",
        "3/24",
        "3/24",
        "3/25",
        "3/25",
        "3/25",
        "3/25",
        "3/26",
        "3/26",
        "3/26",
        "3/26",
        "3/27",
        "3/27",
        "3/27",
        "3/27",
        "3/28",
        "3/28",
        "3/28",
        "3/28",
        "3/29",
        "3/29",
        "3/29",
        "3/29",
        "3/30",
        "3/30",
        "3/30",
        "3/30",
        "3/31",
        "3/31",
        "3/31",
        "3/31"

    );

    for($i=0; $i<124; $i++){

        if($COM_LIST[$i] > $TODAY){

             print_r($COM_LIST[$i]."は今日より過去の日");

        }else{

             print_r($COM_LIST[$i]."は今日より未来");

        }

    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+2

文字列同士の比較は、先頭から1文字ずつ比較していきますので、日付の大小の比較とは成りません。

案1:
月・日ともに、上位ゼロ詰め2桁の表現に統一して、5文字の文字列同士の比較にする

案2:
/で区切って、月と日をそれぞれ数値として比較する。

案3:
strtotimeでタイムスタンプに変換して比較する。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/14 11:12

    もともとゼロ詰めだと思うように処理できていたのですが、かっこ悪いなぁなんて思いながら、結局妥協して今回は案1で対応しました。次は案2か、十分な時間をとって他の方法を考えます。とてもわかりやすい回答をありがとうございました。

    キャンセル

+2

日付の比較をしたいのでしたらdate関数などで変換して型もきちんと合わせないと単なる文字列の比較でしかなくなりますよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/14 10:41

    124なんて固定の数字じゃなく配列のcount()かforeachで対応すべきですね。
    個数増減にあわせてその124も書き換えなきゃいけない。固定値で損することはあっても得することはほとんどないです。

    キャンセル

+1

3/1という文字列は、3÷1という計算になってしまうのでしょうか?

いえ、文字列は辞書順に比較されます。3/10より3/2のほうが、3文字目が後になっている、という理由で「大きい」とされます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/14 11:16

    文字列は辞書順に比較されるんですね。
    勉強になります。ありがとうございました。

    キャンセル

+1

出力をちゃんと見ましたか?
3/10から3/13までが抑制されていることを確認しましたか?

文字列で比較したとき↓こうなります。

  • "9" > "10"
  • "14" > "13"

日付型で比較すべきですが直すなら

    $thisMonth = intval(date('n'));
    $thisDay = intval(date('d'));
    foreach($COM_LIST as $com) {
      [$m, $d] = array_map('intval', explode("/", $com));
      if($m > $thisMonth) { continue; }
      if($m === $thisMonth && $d >= $thisDay) { continue; }
      print_r($com."は今日より過去の日");
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/14 11:15

    >出力をちゃんと見ましたか?
    見ました。
    文字列の大きさ比較がわかっていませんでした。
    そもそも文字列を配列に入れる時点からやり直すべきですね。
    頂いたコメントはぜひ参考にさせていただきたいです。

    ありがとうございました。

    キャンセル

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

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

関連した質問

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