- ベストアンサー
このwhile文(?)の意味が理解できません
PHP初心者です。 まずソースコードを書きます。 <html> <head> <title>sample8</title> </head> <body> <?php $shohin["A01"] = "レモン"; $shohin["A02"] = "バナナ"; $shohin["A03"] = "アップル"; $shohin["A04"] = "オレンジ"; asort($shohin); while(list($code,$name)=each($shohin)) { print("商品コードは".$code."で商品名は".$name."です。<br>"); } ?> </body> </html> このPHPファイルの実行結果が以下になります。 商品コードはA03で商品名はアップルです。 商品コードはA04で商品名はオレンジです。 商品コードはA02で商品名はバナナです。 商品コードはA01で商品名はレモンです。 まず連想配列shohinからeach関数によって値を順番に引き出しているのは分かります。 問題はlist関数内の変数&codeと$nameに関してです。 この2つの変数に値を指定していないのに$codeには配列のコードが$nameには配列の値が自動的に代入されて表示されます。 これはどうしてなのか、というのが疑問です。 例えば、このwhile文(?)はこういうものであると公式のように丸覚えした方がいいのでしょうか。 もしくは、何故こういう風に表示されるのか、を知っておくべきでしょうか。 いきなりこのwhile文(?)が出てきて、訳も分からずに変数にコードを値が代入されるので戸惑っています。 どうぞ宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
まず、 each($shohin) は、現在のカーソル位置から「キー」と「値」のペアを取り出し、カーソルを1つ進めます。 一回目のeachの呼び出しでは {"A03","アップル"} を返します。 list()は、引数に指定した変数の並びに、右辺値のリストから順に値をセットします。従って、1回目の list($code,$name)=each($shohin); は list($code,$name)={"A03","アップル"}; と等価であり $code="A03"; $name"アップル"; と等価です。 簡単に言うと「list()で、$codeと$nameに値が代入される」のです。 そして、while文は、each()が何か値を返す間、条件が「真」になり、 print("商品コードは".$code."で商品名は".$name."です。<br>"); を繰り返します。 5回目のeach()の呼び出しでは、要素が尽きて(カーソル位置が末尾に達して)空の要素を返します。 each()から空の要素が返されるとwhile文の条件が「偽」になり、繰り返しを終了します。 なお、 asort($shohin); は「値をキーにして配列を辞書順にソート」するのでアップル、オレンジ、バナナ、レモンの順で表示されます。
その他の回答 (4)
- mpx
- ベストアンサー率71% (149/209)
>> 丸写しで実行しましたが、それで宜しかったのでしょうか。 丸写しで構いませんが、コンソールでの実行を前提にしていました。 ブラウザで出力を見る場合は、表示内容のソースを見てください(IEの場合は、「表示」->「ソース」で確認) 各eachの出力、listの処理などの動きが分かりやすいかと思いましたが、 かえって混乱させてしまったようですね。m(_ _;)m
お礼
謝る事は決してありません。 自分の知識が足りなかっただけの事です。 不快な気分にさせてしまったのならお詫びします。 >ブラウザで出力を見る場合は、表示内容のソースを見てください(IEの場合は、「表示」->「ソース」で確認) 分かりました。もう一度実行させてソースを見てみます。 善意でやってもらった事なので、有り難く思っています。 気になさらないで下さいね。
- mpx
- ベストアンサー率71% (149/209)
while()の括弧の中で何が行われているか分かりやすいように 処理を分解して表示する 下記スクリプトを実行してみてください。 kozaikuさんの説明と合わせて読むと処理が分かりやすいかと思います <?php $shohin["A01"] = "レモン"; $shohin["A02"] = "バナナ"; $shohin["A03"] = "アップル"; $shohin["A04"] = "オレンジ"; // 4個の配列に対して5回eachを実行して内容を表示します for($i=1;$i<6;$i++){ $b=each($shohin); print "\n{$i}回目のeach(\$shohin)結果\n"; var_dump($b); if(!$b)exit; list($code,$name)=$b; print "上記配列より、list(\$code,\$name)にて、数値のキーのみ若い順に取得します\n"; printf("\$code=%s \$name=%s\n",$code,$name); } ?>
お礼
貴重なアドバイスありがとうございます。 ちょっと複雑ですね。 本当に初心者なので、まだ関数とかあまり覚えていないんですよね。 まず、そこからですね。 each(); dump(); if($b)exit 後は%s 以上の意味が分からないと今一理解できないような気がします。 まずは実行してみますね。 そのままコピペして実行した結果。 1回目のeach($shohin)結果 array(4) { [1]=> string(6) "レモン" ["value"]=> string(6) "レモン" [0]=> string(3) "A01" ["key"]=> string(3) "A01" } 上記配列より、list($code,$name)にて、数値のキーのみ若い順に取得します $code=A01 $name=レモン 2回目のeach($shohin)結果 array(4) { [1]=> string(6) "バナナ" ["value"]=> string(6) "バナナ" [0]=> string(3) "A02" ["key"]=> string(3) "A02" } 上記配列より、list($code,$name)にて、数値のキーのみ若い順に取得します $code=A02 $name=バナナ 3回目のeach($shohin)結果 array(4) { [1]=> string(8) "アップル" ["value"]=> string(8) "アップル" [0]=> string(3) "A03" ["key"]=> string(3) "A03" } 上記配列より、list($code,$name)にて、数値のキーのみ若い順に取得します $code=A03 $name=アップル 4回目のeach($shohin)結果 array(4) { [1]=> string(8) "オレンジ" ["value"]=> string(8) "オレンジ" [0]=> string(3) "A04" ["key"]=> string(3) "A04" } 上記配列より、list($code,$name)にて、数値のキーのみ若い順に取得します $code=A04 $name=オレンジ 5回目のeach($shohin)結果 bool(false) という風に表示されました。 ちょっと今の自分のレベルでは理解不能なんですけど。 丸写しで実行しましたが、それで宜しかったのでしょうか。 残念ながら、今の自分には何が何やらって感じです。 誠に申し訳ありません。
- kozaiku
- ベストアンサー率41% (256/616)
while()の中の=は代入です。(PHPで比較の場合は==) whileのループ判定は( )内の条件判定や式/関数の実行結果がtrueの場合継続、falseの場合打ち切り。 eachで配列を全て撮り出し終えると(注)falseになるのでループを終えます。 注: eachの戻り値がfalseになるからwhile()を終わるのか、 eachの戻り値falseをlistに代入しようとしてlistがfalseとなるからwhile()を終わるのかは 未確認。
お礼
アドバイスありがとうございます。 $shohinはインクリメント無しに次へ進むのですね。 最後の部分は難しいですね。 深く考えるとキリが無いのかもしれませんが、注意だけはしておきます。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
訂正。 >$code="A03"; >$name"アップル"; >と等価です。 $code="A03"; $name="アップル"; と等価です。 の間違い(「=」が抜けた)
お礼
再度のレスありがとうございます。 意味は通じましたので大丈夫です。
お礼
大変分かりやすい説明をして頂き、感謝します。 もう1つだけ質問してもいいでしょうか。 説明を理解したと思っているのですが、極端な話です。 仮に shohin["アップル"] = "A01"; だった場合ちょっと紛らわしいですが、 Scode="アップル"; $name="A01"; という代入になるのでしょうか。 もし、これが正解ならば、自分はこのwhile文を多分理解したのではないか、と思います。 不正解な場合は振り出しに戻るわけですが。 できれば正解だといいですね。
補足
補足という訳ではないですが、お礼に書いた事を実行してみました。 自分の予想したとおりの結果が出たので一応このwhile文の意味を理解できたかな、と思っております。