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

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

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

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

Q&A

解決済

4回答

134閲覧

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

phiilo_

総合スコア85

PHP

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

0グッド

1クリップ

投稿2019/03/14 01:08

編集2019/03/14 01:11

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

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

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

date()

PHP

1<?php 2 3 $TODAY = date("n/d"); 4 $COM_LIST = array( 5 6 "3/1", 7 "3/1", 8 "3/1", 9 "3/1", 10 "3/2", 11 "3/2", 12 "3/2", 13 "3/2", 14 "3/3", 15 "3/3", 16 "3/3", 17 "3/3", 18 "3/4", 19 "3/4", 20 "3/4", 21 "3/4", 22 "3/5", 23 "3/5", 24 "3/5", 25 "3/5", 26 "3/6", 27 "3/6", 28 "3/6", 29 "3/6", 30 "3/7", 31 "3/7", 32 "3/7", 33 "3/7", 34 "3/8", 35 "3/8", 36 "3/8", 37 "3/8", 38 "3/9", 39 "3/9", 40 "3/9", 41 "3/9", 42 "3/10", 43 "3/10", 44 "3/10", 45 "3/10", 46 "3/11", 47 "3/11", 48 "3/11", 49 "3/11", 50 "3/12", 51 "3/12", 52 "3/12", 53 "3/12", 54 "3/13", 55 "3/13", 56 "3/13", 57 "3/13", 58 "3/14", 59 "3/14", 60 "3/14", 61 "3/14", 62 "3/15", 63 "3/15", 64 "3/15", 65 "3/15", 66 "3/16", 67 "3/16", 68 "3/16", 69 "3/16", 70 "3/17", 71 "3/17", 72 "3/17", 73 "3/17", 74 "3/18", 75 "3/18", 76 "3/18", 77 "3/18", 78 "3/19", 79 "3/19", 80 "3/19", 81 "3/19", 82 "3/20", 83 "3/20", 84 "3/20", 85 "3/20", 86 "3/21", 87 "3/21", 88 "3/21", 89 "3/21", 90 "3/22", 91 "3/22", 92 "3/22", 93 "3/22", 94 "3/23", 95 "3/23", 96 "3/23", 97 "3/23", 98 "3/24", 99 "3/24", 100 "3/24", 101 "3/24", 102 "3/25", 103 "3/25", 104 "3/25", 105 "3/25", 106 "3/26", 107 "3/26", 108 "3/26", 109 "3/26", 110 "3/27", 111 "3/27", 112 "3/27", 113 "3/27", 114 "3/28", 115 "3/28", 116 "3/28", 117 "3/28", 118 "3/29", 119 "3/29", 120 "3/29", 121 "3/29", 122 "3/30", 123 "3/30", 124 "3/30", 125 "3/30", 126 "3/31", 127 "3/31", 128 "3/31", 129 "3/31" 130 131 ); 132 133 for($i=0; $i<124; $i++){ 134 135 if($COM_LIST[$i] > $TODAY){ 136 137 print_r($COM_LIST[$i]."は今日より過去の日"); 138 139 }else{ 140 141 print_r($COM_LIST[$i]."は今日より未来"); 142 143 } 144 145 } 146 147?> 148

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

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

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

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

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

guest

回答4

0

ベストアンサー

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

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

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

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

投稿2019/03/14 01:25

otn

総合スコア84555

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

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

phiilo_

2019/03/14 02:12

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

0

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

投稿2019/03/14 01:18

m.ts10806

総合スコア80850

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

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

m.ts10806

2019/03/14 01:41

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

0

出力をちゃんと見ましたか?
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 01:18

papinianus

総合スコア12705

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

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

phiilo_

2019/03/14 02:15

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

0

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

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

投稿2019/03/14 01:14

maisumakun

総合スコア145184

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

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

phiilo_

2019/03/14 02:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問