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

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

ただいまの
回答率

88.35%

phpで生成したプルダウンリストにselectedを付けるには?

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 9,495

MG1986

score 21

前提・実現したいこと

phpで動的に都道府県のプルダウンリストを作ってその初期値を東京にしたい場合どうすればよいでしょうか?

該当のソースコード

<select name="pref" id="pref">
<?php
$options = array('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県');
        for ($i=0; $i < count($options); $i++) {
            echo "<option value=".$options[$i].">".$options[$i]."</option>";
        }
?>
</select>

静的にhtmlだけの場合なら東京のoptionにselectedつけたらいいのですがphpとなるとどうやっているのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

こんな感じです

for ($i=0; $i < count($options); $i++) {
            $attr = $options [$i] == '東京都' ? ' selected' : '';
            echo "<option value=".$options[$i].$attr.">".$options[$i]."</option>";
        }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/08 21:14

    回答ありがとうございます。

    $attr = $options [$i] == '東京都' ? ' selected' : '';

    if使わなくてもできるんですか?

    ifでしたら
    ~~だったら~~して、違うなら~~する
    という風にわかりやすいのですが

    $options [$i] == '東京都' ? ' selected' : '';

    これは文法的にはどうなっているのでしょうか?

    パッと見、配列が東京都ならselectedを付けるというのはわかりますが
    理解したいのです。

    ?はなんでしょうか...?

    キャンセル

  • 2016/06/08 21:44 編集

    その一行は三項演算子という式です。
    極めてシンプルな判定条件かつ返り値を返してほしいときに、他のifとかよりもとても短く書けるすぐれものです。

    分解して解説しますね。

    $options [$i] == '東京都' ? ' selected' : '' は
    (条件判定)?(条件判定でtrueのとき返すもの):(判定がfalseのとき返すもの)
    という形を取ります。

    具体的に書くと
    (条件判定)→ $options [$i] == '東京都'
    (trueのとき返すもの) → ' selected'
    (falseのとき返すもの) → ''  (''は空の文字列です)

    この式は
    $options[$i]は東京都かな? もしそうなら ' selected' 違うなら '' 
    とういう計算をします。

    +とか||とか>=などと同じで A?B:C の「?」と「:」は演算子です。
    ABCと3つの項があるから3項演算子という名前です。演算子なので返り値があります。返す値は計算結果です。
    なので最終的には
    $attr = (3項演算子の返り値);
    という単なる代入式になります。

    キャンセル

  • 2016/06/08 22:30

    詳しくありがとうございます!
    助かりました!

    キャンセル

0

(敢えてコード例は書きません)

  • 東京都の時のみ selected も出力する

という条件分岐をかけたPHPコードをかけばいいですね。


 コメント返信後の追記

条件分岐の書き方がわからないんでしょうか。
もしそうであれば非常に基礎的なことなので回答を得るより先にそちらを学習されたほうが良いように思いますが。。

例えばこういった書き方ができるかと思います。

echo "<option value=".$options[$i].">".$options[$i]."</option>";

の部分を

echo "<option value=".$options[$i]. ($options[$i] == '東京都' ? ' selected' : '') . ">".$options[$i]."</option>";

他の方も既に同様の書き方をされていますが「三項演算子」というのを利用した場合を上げました。


 追記

if文を使った例としてはこんな感じにできるかと思います。

$options = array('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県');

$selected = '東京都';  // 汎用化のためにはこのように変数化しておいたほうがいいと思います

        for ($i=0; $i < count($options); $i++) {
// 付与する属性を分岐
            if($options[$i] == $selected){
              $arg = ' selected';
            } else {
              $arg = '';
            }
            echo '<option value="'.$options[$i].'"'.$arg.">".$options[$i]."</option>";
        }

もしくは

$options = array('北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県','茨城県','栃木県','群馬県','埼玉県','千葉県','東京都','神奈川県','新潟県','富山県','石川県','福井県','山梨県','長野県','岐阜県','静岡県','愛知県','三重県','滋賀県','京都府','大阪府','兵庫県','奈良県','和歌山県','鳥取県','島根県','岡山県','広島県','山口県','徳島県','香川県','愛媛県','高知県','福岡県','佐賀県','長崎県','熊本県','大分県','宮崎県','鹿児島県','沖縄県');

$selected = '東京都';  // 汎用化のためにはこのように変数化しておいたほうがいいと思います

        for ($i=0; $i < count($options); $i++) {
// 出力箇所そのものを分岐
            if($options[$i] == $selected){
              echo '<option value="'.$options[$i].'" selected>".$options[$i]."</option>";
            } else {
              echo '<option value="'.$options[$i].'">'.$options[$i]."</option>";
            }
        }

蛇足でした。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/08 21:12

    そこはわかっているのですが、コードがわからないのです...

    キャンセル

  • 2016/06/08 21:21

    条件分岐をする場合、一般的には

    - if 文による分岐
    - switch文による分岐
    - 三項演算子による分岐(というか場合分け)

    あたりが手段の選択肢としてあがります。

    キャンセル

  • 2016/06/08 21:28

    詳しくありがとうございます!

    三項演算子ですね!
    深く調べてみます!

    キャンセル

0

自分だったら…
都道府県を入力にして ' selected' or '' を返す
関数を作ってそれを利用するのかなあ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/08 22:30

    ありがとうございます!

    キャンセル

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

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

関連した質問

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