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

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

ただいまの
回答率

89.52%

【PHP】DBから取り出した年月をうまく表示したい

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,009
退会済みユーザー

退会済みユーザー

【ソース】

<!DOCTYPE html>
<html>
<head>
    <title>日付選択</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf8">
</head>

<style type="text/css">
h1{
    text-align: center;
    margin-top: 100px;
}
</style>

<body>
<?php

//DBから取り出したDate型の値とする
$values = array("2016-04-01","2016-04-02","2016-04-03","2016-04-04","2016-04-05");
$value = $values[4];

$tmp_arr = array();
for ($t=0; $t < count($values); $t++) { 
    if($values[$t] == $value){
        continue;
    }

    if($values[$t][4] == "-"){
        $values[$t][4] = "年";
    }
    if($values[$t][7] == "-"){
        $values[$t][7] = "月";
    }

    echo $values[$t]."日".nl2br("\n");
}

?>
</body>
</html>


【上記のソース実行結果】
イメージ説明

【理想の実行結果】
イメージ説明

【問題】
以上の結果のように、�文字になってしまいます。そこの文字をそれぞれ年、月としたいのですが、うまくいきません。

【自己分析】
�文字のところはおそらく日本語なので2バイトを超えているので、日本語がおさまっていないように思えます。実際ローマ字にすれば、うまくいきました。(しかしstrと値を入れたとしてもsだけえ表示される)

【質問】
DBから取り出した年月をうまく表示するため、上記のソースのように「-」文字を判定して、年と月の値をそれぞれ割り当てたつもりですが、うまくいきません。
上記のソースのやり方以外のコーディング方法があれば、教えてください。お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 6

+6

日付はdateTimeオブジェクトとして扱うか、date関数を使うと、差分計算が出来たり曜日が出せたりで色々便利なのでお勧めです。

公式
参考URL
例(参考URLから引用)

date_default_timezone_set("Asia/Tokyo");
//DBから取り出したDate型の値とする
$d = new Datetime("2016-04-01");
var_dump($d->format('Y年m月d日'));//string(17) "2016年04月01日"と表示

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+3

正規表現で置き換えてしまうのがいちばん楽です。

$display_str = preg_replace('/^(\d{4})-(\d{2})-(\d{2})$/', '$1年$2月$3日', $values[$t]);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/23 14:52

    毎回ご回答ありがとうございます。うまくいきました!!
    これが正規表現というものですね!大変勉強になりました。

    キャンセル

+2

echo date('Y年m月d日', strtotime($values[$t])) ."<br>";

strtotime関数は便利でよく使います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/23 17:25

    ご回答ありがとうございます。ここまでシンプルで簡単にできるのですね!!
    大変勉強になりました。

    キャンセル

+1

すみません、質問意図と違うようなので以下の内容は気にしないでください…

PHPが保存されている文字コード、DBの文字コードを確認してください。ちぐはぐなようでしたら統一してください。また、その文字コードに合わせてHTMLのheadタグ内に以下のようなタグを埋め込むことで文字化けを防ぐことができます。

<meta charset="UTF-8">

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/23 14:51

    すでに<meta http-equiv="Content-Type" content="text/html; charset=utf8">が入っていますし、漢字のうち1バイトしか入っていないのが要因なので、文字コード設定が間違っているから発生するわけではないです。

    キャンセル

+1

$values[$t]をexplodeしてはいかがでしょうか?

$date = explode("-", $values[$t]);
echo $date[0]."年".$date[1]."月".$date[2]."日<br>";

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/23 14:55

    ご回答ありがとうございます。正規表現以外にexplodeも使えるのですね!!
    大変参考になりました。

    キャンセル

+1

php.iniの文字コード設定とApacheのhttpd.confの文字コードがどうなっているのでしょうか?
UTF-8に統一すれば終わる話だと思いますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/23 16:19

    今回のケースは文字コードの問題ではなく、
    > $values[$t][4] = "年";
    の部分で文字列に対して添字でアクセスしているが、
    この仕様がマルチバイトに対応していないという問題のため、
    php.iniやapacheのconfでは解決できませんね。

    キャンセル

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

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