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

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

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

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

foreach

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

PHP

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

HTML

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

配列

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

Q&A

解決済

2回答

25253閲覧

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

yusuke_k

総合スコア10

for

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

foreach

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

PHP

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

HTML

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

配列

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

1グッド

0クリップ

投稿2016/05/25 07:04

編集2016/05/25 09:22

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項目全てが「東京都」に)

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

KiyoshiMotoki👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

$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 07:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yusuke_k

2016/05/25 07:54

お早い回答ありがとうございます! おかげさまで初期値でちゃんとプルダウンメニューが選択できるようになりました! for文の位置を変えるだけでよかったんですね・・・! ですが申し訳ないです、まだわからないことが、、、 その2の部分ですが「selectedの出し分け」とはどうやればいいのでしょうか・・・? ifとelseを使って条件分岐をするんだろうなと思うのですが、 selectedを使った具体的な記述方法がわかりません。 すいません、ものすごく初歩的なことを聞いているのかもしれません、、、 お願いします、、、
退会済みユーザー

退会済みユーザー

2016/05/25 08: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>ですね(動作には支障ないと思いますが一応)
yusuke_k

2016/05/25 08: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 08:54

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

0

やりかたはいろいろありますが、
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 08:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yusuke_k

2016/05/25 09:17

回答ありがとうございます! うまくいきました!私が読み違えていたんですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問