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

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

ただいまの
回答率

90.53%

  • PHP

    23452questions

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

  • HTML

    11050questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • 配列

    599questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • for

    284questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

  • foreach

    75questions

    foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

【初心者PHP】<select>プルダウンメニューをfor文・foreach文などでスッキリ書きたい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 12K+

yusuke_k

score 2

PHPの勉強を始めて1週間の初心者です。
phpで簡単なメールフォームを作る練習をしています。
ネットで検索していろんなサイトを見ると

<?php
$sel = isset($_POST['select']) ? $_POST['select'] : '';
?>
<html>
<form method="post" action="<?=$_SERVER['SCRIPT_NAME'];?>">
<select name="select">
<option value="a"<?= $sel === 'a' ? ' selected' : ''; ?>>a</option>
<option value="b"<?= $sel === 'b' ? ' selected' : ''; ?>>b</option>
<option value="c"<?= $sel === 'c' ? ' selected' : ''; ?>>c</option>
<option value="d"<?= $sel === 'd' ? ' selected' : ''; ?>>d</option>
</select>
<input type="submit" name="submit" value="送る">
</form>
</html> 

(ネットの記事から引用)

のような解決法が多くありました。
しかし、今私が作ろうとしているプルダウンメニューが
都道府県を選択するメニューなので、
これはあまりにも手間がかかる上にテキスト量が多くなり読みにくくなってしまいます。

for文やforech文などを使って

<?php
if(isset($_POST["send"])){
    $japan = $_POST["japan"];

    $japan = array("", "北海道", "青森県", ..(※省略).... "沖縄県",);

?>
<select class="form3" name="japan">
<?php 

for($i=0; $i<count($japan); $i++){
    echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
}
?>
</select>

と自分で書いてはみたのですが、2点ほどうまくいかない事があります。

その1、初期値が空になって▼マークのみの表示になってしまう。
(一度送信するとなぜかプルダウンし選択できるようになる

その2、選択した項目を送信した後も保持したままにしたい。

そこでお願いしたいのはこの2点の解決方法です。
できればfor文など使用したスッキリした形で完成させたいです。

まだ知らないこともたくさんありますので
もし別の方法があれば教えていただきたいです。
宜しくお願いします。

追記:ネットから引用した前述の方法以外の解決策はないんでしょうか?

追記2:回答を受け以下の記述に直しました。

<?php
$japan = array("", "北海道", "青森県", ..(※省略).... "沖縄県",);

if(isset($_POST["send"])){
    $japans = $_POST["japans"];
}
?>
<select class="form3" name="japan">
<?php 

for($i=0; $i<count($japan); $i++){
    if($_POST["japans"]==$japan[$i]){
        echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
    }
    else{
        echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>');
    }

}
?>
</select>

この記述の結果、その1の問題は解決しました。
しかし送信後のプルダウンメニューが強制的に沖縄県(項目の最後)に移動してしまいました。

その後else部分の$japan[$i]を$_POST["japan"]に変えてみたところ、
送信後のプルダウンメニューの全47項目が選択した都道府県に変わってしまいました、、、

(例… 送信前:「東京都」を選択→
→送信後:47項目全てが「東京都」に)

もうどうすればいいか分かりません、、、

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

$japan = $_POST["japan"];のすぐ後で$japan = array("", "北海道", としているのでどちらかの変数名を変える必要があると思います。

その1に関して
for文や都道府県の配列の部分がif(isset($_POST["send"])){の中にあるので$_POST["send"]がない場合は動作していないのだと思います。

その2に関して
<option>で初期選択されているものを指定する場合は<option selected="selected">とする必要がありまが、for内ではselectedの指定をしていないので一番上のものが選択された状態になっているのだと思います。
echo('option...の前でif($_POST["japan"]==$japan[$i])を使ってselectedの出し分けをしてみてくださ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/25 16:54

    お早い回答ありがとうございます!
    おかげさまで初期値でちゃんとプルダウンメニューが選択できるようになりました!
    for文の位置を変えるだけでよかったんですね・・・!

    ですが申し訳ないです、まだわからないことが、、、
    その2の部分ですが「selectedの出し分け」とはどうやればいいのでしょうか・・・?
    ifとelseを使って条件分岐をするんだろうなと思うのですが、
    selectedを使った具体的な記述方法がわかりません。

    すいません、ものすごく初歩的なことを聞いているのかもしれません、、、
    お願いします、、、

    キャンセル

  • 2016/05/25 17:00

    echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
    これが選択されてない場合の出力で
    echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>');
    こっちが選択されている場合の出力になります。

    ここはphpではなく出力されたhtmlの話しになるので
    http://www.htmq.com/html5/option.shtml
    この辺りのリファレンスを確認されるのがいいと思います。

    すみません最初の回答xhtmlのクセで書いてました<option selected>ですね(動作には支障ないと思いますが一応)

    キャンセル

  • 2016/05/25 17:49

    ご返答ありがとうございます!

    私の解釈の仕方が悪いのでしょうか、どれを選んでも
    送信すると強制的に沖縄県に初期化されてしまいます。

    現在、記述は以下のとおりです。
    <?php
    for($i=0; $i<count($japan); $i++){
    if($_POST["japans"]==$japan[$i]){
    echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>');
    }
    else{
    echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>');
    }
    }
    ?>

    ちなみに最初の回答を受けて$_POSTの方は$japanから$japansへと
    変更してあります。

    それと私なりに考えてelseの2箇所ある$japan[$i]を$_POST["japan"]に
    すれば良いのではないかと試してみたのですが、うまくいきませんでした。


    例えば初期値状態から「東京都」を選択すると
    送信後のプルダウンメニューの47項目が全て東京都に!!(汗)

    確かに選択された項目を再表示に出来てはいるのですが、
    これでは送信後の修正ができませんね、、、

    教えていただいたURLからリファレンスの確認もしたのですが
    まだいまひとつ理解できていないようです、、、

    申し訳ありませんが、あともう少しだけ教えて頂けませんでしょうか?
    お願い致します。

    キャンセル

  • 2016/05/25 17:54

    下記に回答で書きましたが、ifの条件で出す内容が逆になっていますね。

    キャンセル

+1

やりかたはいろいろありますが、
2ですが、forで回してる中を

if($japan[$i] == $_POST["japan"]){
    echo('<option value="' . $japan[$i] . '" selected>' . $japan[$i] . '</option>'); 
}else{
    echo('<option value="' . $japan[$i] . '">' . $japan[$i] . '</option>'); 
}

などとしてみてはいかがでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/05/25 18:17

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

    うまくいきました!私が読み違えていたんですね!

    キャンセル

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

  • PHP

    23452questions

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

  • HTML

    11050questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • 配列

    599questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • for

    284questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

  • foreach

    75questions

    foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。