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

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

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

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

Q&A

解決済

3回答

1158閲覧

日付を数値型にしてfor文でループさせたいのですが

SugiuraY

総合スコア318

PHP

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

0グッド

0クリップ

投稿2016/09/26 03:53

いつもお世話になります。

現在以下のようなテーブルがございます。

<yyyymm> <period> 201606 10

<yyyymm>はint型で格納しております。

ここで
201612
201706
201712
201806
201812

と続く<yyyymm>についてphp側のfor文でループさせることにより
それぞれ、11,12,13,14,15とperiodを割り当てたいと考えております。

しかしながら、これらのyyyymmは10進法と12進法の組み合わせの数値型であることから

+6、+100、+106、+200、+206
よいった形の数列となっているため、
うまく増加部分の指定をすることができません。
また、そもそもこれをyyyymmのdate型にできないかと試みましたが
うまくいきませんでした。

この数値列をうまく利用し、ループさせて適切なperiodを割り当てるシンプルな方法はございますでしょうか。

不慣れなため、わかりづらい表現があれば加筆させて頂きます。

宜しくお願い申し上げます。

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

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

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

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

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

guest

回答3

0

ベストアンサー

201606 10
このレコードが登録されているのであれば、自身の日付より過去の日付で、periodの最大値+1を割り当てればいいんじゃないですかね。


追加
日付から計算する方法も書いておきます。

PHP

1$yyyymm=201612; 2$period = (floor($yyyymm / 100) - 2016) * 2 + floor(($yyyymm % 100) / 12) + 10;

投稿2016/09/26 04:07

編集2016/09/26 04:19
ttyp03

総合スコア16998

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

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

SugiuraY

2016/09/26 05:05

ご回答いただき、有難うございます。 すみません、一点仰って頂いた内容でイメージがわかなかったのですが、 >>このレコードが登録されているのであれば、自身の日付より過去の日付で、periodの最大値+1を割り当てればいいんじゃないですかね。 とは具体的にどのようなことをさしていらっしゃるでしょうか? 宜しくお願い申しあげます。
ttyp03

2016/09/26 05:12

テーブルと書かれているのでデータベースだと思いますが、SQLで言えばこんな感じです。 SELECT max(period)+1 FROM sample WHERE yyyymm < 201612 これは201612の場合の求め方です。
SugiuraY

2016/09/26 06:39

ご回答有難うございます。 それが一番シンプルのように思えます。 max(period)+1のようなことがSQL文でできることを知りませんでした。。。 聞いてよかったです!御礼申し上げます。
guest

0

理解不十分ですが数列に注目してみました(たぶんこんな簡単では無いとおもいますが)

php

1$ar_mm = array(+6, +100, +106, +200, +206); 2$sm = 201606; 3$pi = 11; 4 5foreach ($ar_mm as $key => $val){ 6 echo sprintf("priod:%d %04d%02d",$pi, $sm / 100 + $val / 100, $sm % 100 + $val % 100) ."\n"; 7 $pi++; 8}

投稿2016/09/26 04:58

A.Ichi

総合スコア4070

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

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

SugiuraY

2016/09/26 06:41

ご回答有難うございます。やりたいこと自体は簡単で、ご教示いただいた方法でも準備することができました。 ただ等差部分を配列にいれるのは汎用性が低くなってしまうかもと思っていてためらっておりました。。
guest

0

年月の文字列に一律「01」を足し、基準年月との差分を撮るのはどうでしょうか?
手元にPHPの環境がないので動作未確認ですので、イメージだけ感じてもらえると幸いです。

PHP

1 // 基準年月をDateTimeに変換 2 $baseMonth = date_create("20160601"); 3 4 foreach($monthArrays as $targetMonth) { 5 // 比較対象の年月をDateTimeに変換しつつ、差分(DateInterval)を取得 6 $diff = date_diff(date_create($targetMonth + "01"), $baseMonth); 7 // 差分の月数を算出 8 $period = $diff->y * 12 + $diff->m; 9 }

・参考
http://php.net/manual/ja/function.date-create.php
http://php.net/manual/ja/class.dateinterval.php
http://php.net/manual/ja/function.date-diff.php

投稿2016/09/26 04:19

ijufumi

総合スコア276

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

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

SugiuraY

2016/09/26 06:35

ご回答有難うございます。 なるほど、とりあえず、かりそめに01を割り当ててしまってDateとして計算するんですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問