• ベストアンサー

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(アップデータしたばかり)です。

  • reiman
  • お礼率73% (794/1076)
  • PHP
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

2番目のforeachで$valueは$a['z']への参照になっています。 3番目は foreach($a as $key=>$a['z']) { print"$key:$a[z]\n"; } と同じことになります。 3回目のforeachの前に参照をリセットして unset($value); foreach($a as $key=>$value) { print"$key:$value\n"; } なら大丈夫でしょう。

reiman
質問者

お礼

できました。 ありがとうございます。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

各ループで配列を表示すると$a['z']が変わっているのが確認できます。 <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>>"; } $i = 1; foreach($a as $key=>$value) { echo $i++ . "回目\n"; print_r($a); print"$key:$value\n"; } ?> </pre>

noname#39970
noname#39970
回答No.1

2回目のが &$value になってるのは?

reiman
質問者

補足

ありがとうございます。 php4でなかった機能&のテストをしています。 &を取ると<<>>はつきません。 というより <<>>を付けるのが目的でなく&の機能を調べるのが目的です。 具体的にどういうコードにすればよいでしょうか?

関連するQ&A

  • foreachについて

    phpを今勉強中なのですがforeachで少し分からない部分があります。 例えば(1)はnのある配列を消去するだけのプログラムでして、これを (2)のように書き換えてみると、全て表示されてしまい、(1)と同じ動きをしません。 phpマニュアルを読む限り同じ動きをすると思うのですが、array_keys($key1)の中に うまく一時配列のキーが入っていないように思います。 どうしてでしょうか? (1) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if($key=="n") unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?> (2) <?php $food["y"]["bb"]= "k1"; $food["n"]["bb"]= "k2"; $food["n"]["cc"]= "k3"; $food["k"]["dd"]= "k4"; foreach($food as $key=>$key1){ foreach($key1 as $key2=>$key3){ if(in_array("n",array_keys($key1))) unset($food[$key][$key2]); } } echo "<pre>"; print_r($food); echo "</pre>"; ?>

    • ベストアンサー
    • 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について

    下記の配列についてitem2の値のみ取り出したいのですが、 foreach($food as $key1=>$array){ foreach($array as $key2=>$array2){ echo $food["$key1"]["item2"]; } } foreachで回して取り出すと555444333となります。 543という結果が欲しいのですが、 実際には下記の配列が数百と大量にあり、一次元配列の数字は下記のように0から1ずつ増えていきます。(二次元目のキーは全てitem0~item2となっています) キーの変更をしないでitem2の値のみ一度に取り出すにはどうしたらよいのでしょうか? (取り出す前に配列の削除などのプログラムもあるため、0から順番に並んでいるとは限りません。 ) $food["0"]["item0"]="y"; $food["0"]["item1"]="bi"; $food["0"]["item2"]="5"; $food["1"]["item0"]="y"; $food["1"]["item1"]="dou"; $food["1"]["item2"]="4"; $food["2"]["item0"]="n"; $food["2"]["item1"]="co"; $food["2"]["item2"]="3";

    • ベストアンサー
    • PHP
  • foreachとかの勝手な省略?

    PHP初心者です。 foreachを使うときに、参考サイトのソースを見て???だったのですが、 例えば以下の場合に foreach($_POST['hoge'] as $key => $val){ echo "$key : $val \n"; } とありますが、hogeは自分で決めたものなので分かるのですが、 見に覚えの無い$key => $valといった変数で動作しています。 $keyや$valは自分で定義した覚えはありません。 調べると$keyは分かりませんが、$valはvalueの省略みたいな記述がありました。 また、他には更に短縮され、$kとか$vしか記述されていないソースもあり、 試すとこれでも正常に動いています。 これはどういうことなのでしょうか? 何か決まりがあるのでしょうか。 ちなみに、チェックボックスの配列取得の定義に使いました。 私からはただ勝手に短縮しているようにしか見えず納得いきません。 お詳しい方、どなたかアドバイス頂けないでしょうか。 宜しくお願いします。

    • ベストアンサー
    • 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
  • switch文の中でforeach

    switch文の中でforeachをしたいのですが、うまくいきません。 <現状> $x=5; switch( $x ){  case 2:   echo $x="JavaScript";    break;  case 5:   echo $x="PHP";   break;  default:   echo $x="未分類"; } <やりたいこと>判定データを別で用意して、読み込ませたい $x_master = array(  2 => "JavaScript",  5 => "PHP", ); ■テスト1 $x=5; switch( $x ){  foreach( $x_master as $key => $value ){   case $key:    echo $x=$value;   break;  }   default:    echo $x="未分類"; } これを試すと、Parse error: syntax error, unexpected T_FOREACH, expecting T_CASE or T_DEFAULT or '}'となります。これは、switchの中でforeachは使えないということでしょうか? ■テスト2 $x=5; foreach( $x_master as $key => $value ){  switch( $x ){   case $key:    echo $x=$value;    break;   default:    echo $x="未分類";  } } $x=2;だとJavaScript未分類となるのに、$x=5;だと未分類未分類になります。 $x=2と$x=5で挙動が異なる理由が分かりません。 ■テスト3 $x=5; foreach( $x_master as $key => $value ){  switch( $x ){   case $key:    echo $x=$value;   break;  } } これでようやく望んだ結果が得られたのですが、これでo.k.のなのでしょうか? なんでdefault入れてはダメなのでしょうか? foreachでいくら回しても、該当部分が存在する限り、breakして、defaultへはいかないと思うのですが…。それともforeachの一番最後の終了処理で何かが返ってきて、それが該当項目に存在せず、defaultへ流れる結果となるのでしょうか? そもそも、考え方として、foreachで回している以上、この場合、例外というか、switch文のdefaultに該当する部分は必要ないとの認識でよいでしょうか? 質問内容 ■テスト1が、syntax errorとなる理由 ■テスト2で、$x=2なら$x_masterを読み込むのに、$x=5なら$x_masterを読み込まない理由 ■テスト3のケースは、default部分を本当に書かなくてo.k.でしょうか? またその理由は?

    • ベストアンサー
    • PHP
  • 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
  • foreach内での$_の書き換え

    数年前にハッシュのデータをforeachで取り出す時、$_をいじると、$_はハッシュのデータと直接つながっているので、ハッシュのデータ(keyは変わらずvalueのほう)が書き換わってしまうと聞き、実際にやってみて書き換わってしまった覚えがあります。 %hash = ("red" => "aka", "green" => "midori", "blue" => "ao", "black" => "kuro"); foreach (%hash){ print "$_<br>\n"; $_ = "modify"; } print "<hr>\n"; foreach (values %hash ){ print "$_<br>\n"; } ↓↓↓↓↓↓html↓↓↓↓↓↓↓ blue ao green midori red aka black kuro ------------------------------------ modify modify modify modify ↑となったはず 先日それを試してみたら書き換わりませんでした。 以前は確かに書き換わった覚えがあります。 perlの仕様が変わったのでしょうか。それとも私が何か間違っているのでしょうか。 詳しい方にお教えいただければと質問しました。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • foreach のバグでしょうか。PHP 5.3.3 で悩んだところが

    foreach のバグでしょうか。PHP 5.3.3 で悩んだところがあります。 あるレコードが正規表現にマッチした場合、そのレコードに対して何らかの処理をするスクリプトを書いていました。 しかし思ったように動かず原因を調べました。結果、配列の値が変わっていることに気づきました。  ◇テスト用レコードの内容   http://www.yahoo.co.jp/   http://www.bing.com/   http://www.goo.ne.jp/   http://www.google.co.jp   http://d.hatena.ne.jp/  ◇先頭一致して欲しい文字列   http://www.google.co.jp/   http://www.bing.com/   http://www.youtube.com/  この場合、処理の対象は2件です。  私が書いたスクリプトでは3回マッチしてしまいます。  以下、テスト用に作ったスクリプトです。 <?php // URL のパターンを用意 (とりあえず以下の3パターン) $ar = array(); $ar['Google'] = array(  'URL' => 'http://www.google.co.jp/' ); $ar['Bing'] = array(  'URL' => 'http://www.bing.com/' ); $ar['YouTube'] = array(  'URL' => 'http://www.youtube.com/' ); // 先頭一致の正規表現にする foreach($ar as $key => &$value){  $value['regex'] = '/^' . preg_quote($value['URL'], '/') . '/'; } echo("URL の パターンを出力してみる/n"); print_r($ar); // テスト用 レコード $list = array(); $list[] = 'http://www.yahoo.co.jp/'; $list[] = 'http://www.bing.com/'; // match. $list[] = 'http://www.goo.ne.jp/'; $list[] = 'http://www.google.co.jp/'; // match. $list[] = 'http://d.hatena.ne.jp/'; // マッチするのは2回のみ...のはずが for($n = 0; $n < count($list); $n ++){  foreach($ar as $key => $value){   if(preg_match($value['regex'], $list[$n], $match)) echo("match.\n");  } } echo("もう一度 URL のパターンを出力してみる\n"); print_r($ar); echo("なぜか一番最後の配列の値が変わっている。\n"); ?>

    • ベストアンサー
    • PHP
  • foreachの実行結果について

    お世話になります。 以下のソースの実行結果が自分のトレースしたのと何故違うのか頭を抱えています。 ご指導よろしくお願いします。 <?php $arr=array(array(100,200),array('aaa','bbb','ccc')); foreach($arr as $foo){ print "*****\n"; foreach($foo as $var){ print $var ."\n"; } } ?> <自分の答え> ***** 100 ***** 200 ***** aaa ***** bbb ***** ccc <正解> ***** 100 200 ***** aaa bbb ccc 正解の回答に納得が行かないのです… foreach文がネストしてて内側のforeachの処理が一回終了してから 外側のforeachにいくものだと自分は思っています。 違うのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう