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

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

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

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

Q&A

5回答

1972閲覧

PHPの問題

Sen

総合スコア12

PHP

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

0グッド

1クリップ

投稿2015/06/15 10:46

2010/09/01
2010/10/12
2010/8/2
2010/10/2
2010/5/12

2010/09/01
2010/10/12
2010/08/02
2010/10/02
2010/05/12

となるようにしたいのですが、どうすればいいですか?

lang

1<html> 2<head> 3 <meta http-equiv="content-type" content="text/html;charset=utf-8"/> 4 <title></title> 5</head> 6<body> 7<?php 8 $str = array("2010-09-01","2010.10.12","2010-8-2","2010-10-2","2010-5-12"); 9?> 10</body> 11</html>

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

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

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

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

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

guest

回答5

0

http://php.net/manual/ja/datetime.format.php

lang

1<?php 2//string型では無いので変数名strは適切ではない。arrが適切 3$arr = array("2010-09-01","2010.10.12","2010-8-2","2010-10-2","2010-5-12"); 4foreach ( $arr as $date_str ) 5{ 6 $date = date_create($date_str); 7 echo date_format($date, 'Y/m/d'); 8}

投稿2015/06/15 10:52

編集2015/06/15 11:12
nanndemoiikara

総合スコア775

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

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

0

lang

1<?php 2$dates = array("2010-09-01", "2010.10.12", "2010-8-2", "2010-10-2", "2010-5-12"); 3foreach ($dates as $date) { 4 if (preg_match('/^(\d{4})\D(\d{1,2})\D(\d{1,2})$/', $date, $m)) { 5 echo sprintf('%4d/%02d/%02d', $m[1], $m[2], $m[3]) . '<br>'; 6 } 7}

正規表現で解いてみました。
数字4桁, 数字以外の1文字, 数字1または2桁, 数字以外の1文字, 数字1または2桁
にマッチします。

投稿2015/06/19 04:58

編集2015/06/19 05:17
naga3

総合スコア1293

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

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

nanndemoiikara

2015/06/19 05:14

記述頂きありがとうございます。 極論で申し訳ございません。 この記述だと配列が $dates = array("10000-09-01", "2010.10.12", "2010-8-2", "2010-10-2", "2010-5-12") だった場合 0/10/12 2010/10/12 2010/08/02 2010/10/02 2010/05/12 となってしまいます。 ただ、この方法だと 19780109でも正しく動作しますし、私 の 中 では こちらの質問の最適解に近いと思います。 上記の方法の解決方法として条件の中に checkdate関数を挟む処理等はいかがでしょうか? if ( preg_match('/(\d{4})\D(\d{1,2})\D(\d{1,2})/', $date, $m) &&checkdate($m[3], $m[2], $m[1]) ) { ...
nanndemoiikara

2015/06/19 05:15

失礼しました。 if ( preg_match('/(\d{4})\D(\d{1,2})\D(\d{1,2})/', $date, $m) &&checkdate($m[2], $m[3], $m[1]) ) { ... ですね。
nanndemoiikara

2015/06/19 05:19

連投申し訳ございません。 if ( preg_match('/^(\d{4})\D(\d{1,2})\D(\d{1,2})/$', $date, $m) ) この条件も一考の余地があるかと思いました。 どのように思われますでしょうか?
naga3

2015/06/19 05:19

ちょっと正規表現が甘かったので ^$ を追加しました。 これで10000-09-01は弾けるはずです。 でも32日とかは通してしまうのでcheckdateも併用するのが良いですね。
nanndemoiikara

2015/06/19 05:28

ありがとうございます。 大変勉強になります。
naga3

2015/06/19 05:32

おっと被っちゃいましたね 19780109は通さないので、通すためには /^(\d{4})\D?(\d{1,2})\D?(\d{1,2})$/ こんな感じです。
nanndemoiikara

2015/06/19 05:41

連投してしまい申し訳ございませんでした。 そうですね。 /^(\d{4})\D?(\d{1,2})\D?(\d{1,2})$/ の正規表現が良いと思います。 ありがとうございます。
guest

0

あー、すいません見落としていました。
それだとダメですね。。

投稿2015/06/19 03:45

gtakat

総合スコア206

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

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

0

他の方が書いているように、ある程度元データの書式が定まっているのならstrtotimeでも良いんじゃないかなと思います。

他の例ということでsscanfで考えてみました。

lang

1$list = array( 2 '2010/09/01', 3 '2010/10/12', 4 '2010/8/2', 5 '2010/10/2', 6 '2010/5/12' 7); 8 9$newList = array(); 10 11foreach ($list as $date) { 12 list($y, $m, $d) = sscanf($date, '%d/%d/%d'); 13 $newList[] = sprintf('%04d/%02d/%02d', $y, $m, $d); 14} 15 16var_dump($newList);

投稿2015/06/19 03:32

gtakat

総合スコア206

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

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

nanndemoiikara

2015/06/19 03:38

サンプルでは「.」がセクションになっているデータがあります。 「2010.10.12」 このコードはサンプルコードの配列では正しく動作しないかと思いますが。。。
gtakat

2015/06/19 03:46

すいません身としていました。 これだとダメです。 そしてさらに間違えて回答に書いてしまいました。 出直してきます。。。
guest

0

下記でどうでしょうか?

lang

1 $str = array("2010-09-01","2010-10-12","2010-8-2","2010-10-2","2010-5-12"); 2 $result = array_map(function($s) { return date('Y/m/d', strtotime($s)); }, $str); 3 var_dump($result); 4/* 5array(5) { 6 [0]=> 7 string(10) "2010/09/01" 8 [1]=> 9 string(10) "2010/10/12" 10 [2]=> 11 string(10) "2010/08/02" 12 [3]=> 13 string(10) "2010/10/02" 14 [4]=> 15 string(10) "2010/05/12" 16} 17*/

投稿2015/06/15 10:58

k.tada

総合スコア1679

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

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

k.tada

2015/06/16 02:40

なるほど。strtotimeにはこのような問題があるのですね。 今回のお題ではたまたま問題なかったですが、使用する際は注意が必要ですね。 ご指摘ありがとうございます。
naga3

2015/06/19 04:10

date_create(DateTime)でもstrtotimeと同じ問題があるので注意する必要はあります。 オーバーフローは挙動が違いますが、どちらにせよエラー処理しなければなりません。
nanndemoiikara

2015/06/19 04:28

ご指摘頂きありがとうございます。 エラーが発生しないという意味では t.tada様の書かれているこちらの回答が正解に近い物かとおもわれます。 先ほどもコメントさせて頂いた内容ではございますが サンプルでは「.」がセクションになっているデータがあります。 その為、私のコードではエラーが発生します。 こちらの問題は今でも回答はどのようなコードが最適なのかは疑問に思っております。 何か良いコードがあれば記述頂けますと幸いでございます。
naga3

2015/06/19 04:59

別コメントにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問