PHPのforeachと連想配列変数についての疑問

このQ&Aのポイント
  • PHPのforeachと連想配列変数についての疑問について説明します。
  • foreachと連想配列変数を使用する場合の動作について具体的な例を挙げながら解説します。
  • foreachとは、配列やオブジェクトの要素を順番に取り出すための制御構文であり、その動作を理解することでコードの理解が深まります。
回答を見る
  • ベストアンサー

foreachと連想配列変数について

はじめまして。 初めて質問します。 私はあまりプログラム知識がないのですが、PHPに興味があり独学でPHPを勉強しているのですが、よくわからない個所があって困っています。 <?php $list[0]["code"] = "0100:"; $list[0]["name"] = "ミルクパン"; $list[1]["code"] = ""; $list[1]["name"] = "イチゴパン"; $list[2]["code"] = "0301:"; $list[2]["name"] = "メロンパン"; foreach($list as $data) { $product = ""; foreach($data as $value) { if ($value == "") continue 2; $product .= $value; } print $product."\n"; } ?> 実行結果 0100:ミルクパン 0301:メロンパン と本に書いてあるのですが、 0100:ミルクパン 0301:メロンパン と表示されるのがよくわかりません。 $product .= $value; で、なぜ "0100:"と"ミルクパン"が表示されるのでしょう。 普通のforeach($list as $value)ならイメージできるのですが、 二重にforeachがあるので、 ($list as $data) ($data as $value) の意味がよくわからないです。 どなたかご教授していただけませんでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

$product .= $value; の「.」は連結です。 つまり、 $product =$product . $value; の意味。 $productに先codeが入っているわけですから、そのcodeに次にくるnameがくっつく。 データの形をこう考えるとわかりやすいかな? 0 0100 ミルクパン 1 (無し) イチゴパン 2 0301 メロンパン 最初のforeachは、[0][1][2]・・・ が回ります。 2回目のforeachは、入れ子(ネスト)状態にあります。 つまり、内側に入っている foreachは、[0]のデータを回しますから [code][name] が順番に回ります。 わかりやすく、処理を除いた foreachのみを書き出します foreach($list as $data) {//行のループ開始。[0][1][2]・・  foreach($data as $value) { //列のループ開始(入れ子)[code][name]・・・  }//列のループ終わり }//行のループ終わり こうなります。 つまり、 $data は、 $data = array('code'=>なんとか, 'name'=>かんとか); という1行のデータを表します。 この状態で、$dataを foreachすれば、code。name・・ と行を1つづつ移動するループとなります。

tabibito_
質問者

お礼

回答ありがとうございます。 勉強不足な点で分らないところがありますが >最初のforeachは、[0][1][2]・・・ が回ります。 >つまり、内側に入っている foreachは、[0]のデータを回しますから [code][name] が順番に回ります。 一旦、連想配列変数について調べてみようと思いました。 内側に入っているforeachの動きなども[code][name] が順番に回る仕組み もまだ理解できないのですが、 ようやく全体像が見えてきたのと道しるべをしていただけた感じでやっぱり自分だけで考えているのと違って大変参考になります。 回答を参考にして勉強してみます^^

関連するQ&A

  • 二次元配列のforeachはどうすれば?

    <form action="form_check.php" method="POST"> <input type="checkbox" name="check[]" value="aaaa"> <input type="checkbox" name="check[]" value="bbbb"> <input type="checkbox" name="check[]" value="cccc"> <input type="submit" value="送信"> </form> フォームでこのように送りました このデータを受け取り、1つにまとめたいのですが foreach($_POST[check] as $val){ if($all){ $all .= ",".$val; }else{ $all = $val; } } このようにしてみたところ Warning: Invalid argument supplied for foreach() とエラーが出ました。 二次元配列でforeachのループをかけるときはどのように記述すればいいのでしょうか。

    • ベストアンサー
    • PHP
  • 多次元配列で、foreachを使って、key値を

    多次元配列で、foreachを使って、key値を入れ替えているのですが、 なんで、こうなるか分かりません。  $x = array();  $x[] = array(   "id" => 1,   "name" => "JavaScript",  );  $x[] = array(   "id" => 5,   "name" => "PHP",  );  $z = array();  foreach($x as $key => $value){   $z[$value["id"]] = $value;   }  print_r($z); 配列のKEYをIDに変更しているのですが、 なんで、こうなるのでしょうか? 特に、  $z[$value["id"]] = $value; が分かりません。 例えば、foerachの途中で、var_dumpすると、 1回目だと、 ◆$key 0 ◆$value Array (  [id] => 1  [name] => JavaScript ) ◆$value["id"] 1 まではいいのですが、 ◆$z[$value["id"]] の値が見れません。 ここはどんな処理をやっているのでしょうか?

    • ベストアンサー
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • foreachの疑問

    <pre> <?php $a=array('x'=>1,'y'=>2,'z'=>3); foreach($a as $key=>$value) { print"$key:$value\n"; } foreach($a as $key=>&$value) { $value="<<$value>>"; } foreach($a as $key=>$value) { print"$key:$value\n"; } ?> </pre> の応答が x:1 y:2 z:3 x:<<1>> y:<<2>> z:<<2>> となり x:1 y:2 z:3 x:<<1>> y:<<2>> z:<<3>> となりません。 どうすればよいでしょうか? 環境はFedoraCore4-PHP5(アップデータしたばかり)です。

    • ベストアンサー
    • PHP
  • [初歩?]FOREACHの構文エラーの原因がわからない

    下記を表示すると Warning: Invalid argument supplied for foreach() in とエラーになってしまい、どうしても原因がわからないのですが・・ よろしくお願い致します <html> <body> <form action="$PHP_SELF" method="post"> <input type="radio" name="q2[]" value="0"<?php foreach ($_POST['q2'] as $q2_sel) { if ( $q2_sel == '0') { echo " selected"; }} ?>>男 <input type="radio" name="q2[]" value="1"<?php foreach ($_POST['q2'] as $q2_sel) { if ( $q2_sel == '1') { echo " selected"; }} ?>>女 </form> </body> </html>

    • ベストアンサー
    • PHP
  • 配列について

    下記の配列から値を取り出して表示させたいのですが上手くいかず困っています。 array(3) { [0]=> object(stdClass)#2849 (2) { ["name"]=> string(29) "1月" ["count"]=> string(1) "1" } [1]=> object(stdClass)#2848 (2) { ["name"]=> string(29) "2月" ["count"]=> string(1) "2" } [2]=> object(stdClass)#2847 (2) { ["name"]=> string(29) "3月" ["count"]=> string(1) "1" } } <li>1月(1)</li> <li>2月(2)</li> <li>3月(1)</li> 上記のような一覧表示させるにはどのようにすればいいのでしょうか? 下記のようにすると<li>3月</li><li>1</li>となってしまいどうすればいいのかわかりません。 <?php $eventlist = get_meta_values('event_2'); foreach ( $eventlist as $key=>$value) { foreach ( $value as $key2=>$value2) { echo '<li>' . $value2 . '</li>'; } } ?> どうかよろしくお願いします。

    • 締切済み
    • PHP
  • foreachで配列を作る

    $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { $data_list[]=array( $array[0]=>$row["$array[0]"], $array[1]=>$row["$array[1]"], $array[2]=>$row["$array[2]"], $array[3]=>$row["$array[3]"], $array[4]=>$row["$array[4]"], $array[5]=>$row["$array[5]"]); } をforeachを使って $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { foreach(~){             //処理     } のようにかきかえたいのですがどうしたらいいでしょうか?foreachをしらべていろろやったのですがうまくいきません。よろしくおねがいします。  ちなみに$data_list[]の配列はArray ( [0] => id [1] => name [2] => address [3] => tel [4] => point [5] => a1 ) Array ( [0] => Array ( [id] => 0 [name] => ここあ [address] => 東京 [tel] => 2 [point] => 2 [a1] => 2 ) [1] => Array ( [id] => 1 [name] => 太郎 [address] => 東京 [tel] => 3 [point] => 5 [a1] => あ ) [2] => Array ( [id] => 4 [name] => 五郎 [address] => 東京 [tel] => 0 [point] => 1 [a1] => あああああ ) [3] => Array ( [id] => 5 [name] => 士郎 [address] => 神奈川 [tel] => 26 [point] => 5 [a1] => ああああああああああ ) …となります。

    • 締切済み
    • PHP
  • foreachの中で使われている\の意味

    ●質問の主旨 下記のforeach文の中で使われている"\"は、 どういう意味で使われているのでしょうか? ご存知の方、ご教示よろしくお願いします。 ●コード(index.phpの一部) <tr> <td>書籍の満足度は?</td> <td> <?php // 配列からラジオボタンを作成する $ar_rate = array( "5"=>"満足", "4"=>"やや満足", "3"=>"普通", "2"=>"やや不満", "1"=>"不満", ); foreach ($ar_rate as $key=>$value) { echo "<input type=\"radio\" name=\"rate1\" value=\"{$key}\">{$value}"; } ?> </td> </tr> <tr> <td>書籍のボリュームは?</td> <td> <?php // 配列からラジオボタンを作成する foreach ($ar_rate as $key=>$value) { echo "<input type=\"radio\" name=\"rate2\" value=\"{$key}\">{$value}"; } ?> </td> </tr> ●参考文献 西沢直木 PHPプログラミングの教科書P175

    • ベストアンサー
    • PHP
  • 連想配列の処理

    こんにちは。 MySQL 4.1.22 と PHP 4.4.7 でプログラムを組んでいて、こちらではいつも皆様の知識と経験を参考にさせていただいております。 今回、どうしても超えられない壁に当たってしまいコーディングが止まってしまったので力をお貸し下さい。 今取り組んでいるプログラムは、複数の<checkbox>から選択した値を受け取って、マスターテーブルに検索を掛けて、返った値を表示した後、確認ボタンで別のユーザーテーブルに値を格納するというものです。 *** プログラムの流れ **** input.php(入力ページ:checkbox )  ↓ view.php (確認ページ:CC_master.tbl)  ↓ regist.php (登録ページ:user_master.tbl) input.php から値を取得して、 CC_master.tbl に検索・値の取得までは出来たのですが、取得した値を別の形に整形するところでつまづいてしまいました。 //--- input.php --- //--- 実際には 99個の checkbox がある訳ではありません。^^; <form name="form" method="POST" action="view.php"> <input type="checkbox" name="cc[]" value="1">50cc <input type="checkbox" name="cc[]" value="2">80cc <input type="checkbox" name="cc[]" value="3">125cc <input type="checkbox" name="cc[]" value="4">200cc <input type="checkbox" name="cc[]" value="5">250cc <input type="checkbox" name="cc[]" value="6">400cc   ・   ・(中略)   ・ <input type="checkbox" name="cc[]" value="99">その他 <input type="submit" name="exec" value="排気量の確認"> </form> //--- END Code --- //--- view.php --- //--- チェックされた排気量コードを CC_master.tbl に対して検索をかける //---例:1番、2番、6番にチェックを入れたとして... //---具体的な排気量を「 50cc 80cc 400cc 」の様に一列、スペース区切りで変数($cc_name)に格納、表示 $arr_cc = $_POST["cc"]; if(isset($arr_cc) and count($arr_cc) > 0){ $val = ""; for($i=0; $i<count($arr_cc); $i++ ){ if($i == 0){ $val .= $arr_cc[$i]; }else{ $val .= "," . $arr_cc[$i]; } } } $res = mysql_query("select * from CC_master where id in ('$val')"); while($row = mysql_fetch_array($res)){ # #ここで配列からフィールド:cc の値のみを取り出して、変数 $cc_name に格納。 # } ecoh $cc_name; //--- END Code --- //--- regist.php --- //--- $cc_name の値をINSERT文で user_master.tbl に登録。 現在、上記のように考えていますが、どうしても変数 $cc_name に意図した形で値を格納できません。 $val に値を入れる要領で処理すればOKだと思うのですが、while( )、for( )、foreach( ) のどれを使っても上手くいきません。連想配列となる $row["cc"] の扱い方(整形方法)がどうしても解らないで助けて下さい。 宜しくお願いします。 //--- CC_master.tbl --- CREATE TABLE `CC_master` ( `id` int(2) NOT NULL default '0', `cc` varchar(10) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=ujis; INSERT INTO `CC_master` (`id`, `cc`) VALUES (1, '50cc'), (2, '80cc'), (3, '125cc'), (4, '200cc'), (5, '250cc'), (6, '400cc'),   ・   ・(中略)   ・ (99, 'その他');

    • 締切済み
    • PHP
  • Smartyのforeachのnameに変数を設定

    こんにちは. 本日質問したいのは,Smartyのforeach文について, nameに変数を割り当てる方法です. 具体的には,foreachをネストして 外のforeachのitemを中のforeachのnameに当てたいのですが, どうにも上手くできません. もしも上手いやり方をご存知の方がいらっしゃいましたら, ご教授頂けると幸いです. よろしくお願いいたします. ↓ソースの例↓ {foreach from=$type item=v}   {foreach from=$data[$v] name=$v}     ここで,内側のforeachのindexを表示したい.   {/foreach} {/foreach}

    • ベストアンサー
    • PHP

専門家に質問してみよう