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

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

ただいまの
回答率

90.61%

  • PHP

    19820questions

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

PHPの問題

受付中

回答 5

投稿

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

Sen

score 5

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

となるようにしたいのですが、どうすればいいですか?
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    <title></title>
</head>
<body>
<?php
    $str = array("2010-09-01","2010.10.12","2010-8-2","2010-10-2","2010-5-12");
?>
</body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+4

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/19 14: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]) ) {
    ...

    キャンセル

  • 2015/06/19 14:15

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

    ですね。

    キャンセル

  • 2015/06/19 14:19

    連投申し訳ございません。

    if ( preg_match('/^(\d{4})\D(\d{1,2})\D(\d{1,2})/$', $date, $m) )
    この条件も一考の余地があるかと思いました。

    どのように思われますでしょうか?

    キャンセル

  • 2015/06/19 14:19

    ちょっと正規表現が甘かったので ^$ を追加しました。
    これで10000-09-01は弾けるはずです。

    でも32日とかは通してしまうのでcheckdateも併用するのが良いですね。

    キャンセル

  • 2015/06/19 14:28

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

    キャンセル

  • 2015/06/19 14:32

    おっと被っちゃいましたね

    19780109は通さないので、通すためには
    /^(\d{4})\D?(\d{1,2})\D?(\d{1,2})$/
    こんな感じです。

    キャンセル

  • 2015/06/19 14:41

    連投してしまい申し訳ございませんでした。

    そうですね。
    /^(\d{4})\D?(\d{1,2})\D?(\d{1,2})$/
    の正規表現が良いと思います。

    ありがとうございます。

    キャンセル

0

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

他の例ということでsscanfで考えてみました。
$list = array(
    '2010/09/01',
    '2010/10/12',
    '2010/8/2',
    '2010/10/2',
    '2010/5/12'
);

$newList = array();

foreach ($list as $date) {
    list($y, $m, $d) = sscanf($date, '%d/%d/%d');
    $newList[] = sprintf('%04d/%02d/%02d', $y, $m, $d);
}

var_dump($newList);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/19 12:38

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

    キャンセル

  • 2015/06/19 12:46

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

下記でどうでしょうか?

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/06/15 20:01

    http://scrap.php.xdomain.jp/php_strtotime_trap/

    キャンセル

  • 2015/06/16 11:40

    なるほど。strtotimeにはこのような問題があるのですね。

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

    キャンセル

  • 2015/06/19 13:10

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

    キャンセル

  • 2015/06/19 13:28

    ご指摘頂きありがとうございます。

    エラーが発生しないという意味では
    t.tada様の書かれているこちらの回答が正解に近い物かとおもわれます。

    先ほどもコメントさせて頂いた内容ではございますが
    サンプルでは「.」がセクションになっているデータがあります。
    その為、私のコードではエラーが発生します。

    こちらの問題は今でも回答はどのようなコードが最適なのかは疑問に思っております。
    何か良いコードがあれば記述頂けますと幸いでございます。

    キャンセル

  • 2015/06/19 13:59

    別コメントにしました。

    キャンセル

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

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

関連した質問

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

  • PHP

    19820questions

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