• ベストアンサー

foreachの実行結果について

march4の回答

  • march4
  • ベストアンサー率50% (12/24)
回答No.3

私の出る幕は無さそうですが、ちょっとだけ。 ><?php $arr=array(array(100,200),array('aaa','bbb','ccc')); foreach($arr as $foo){ print "*****\n"; foreach($foo as $var){ print $var ."\n"; } } ?> というコードを日本語でどういうフローになるか話してみますと、 親配列(子配列1、子配列2)をforeachでもって、 配列内の要素をすべて出し切る処理ですね。 foreachは、「全て出し切るまで、許してくれません(解放してくれません)」ので、 子配列1に処理が及ぶと、まず、子配列の要素全てが出力されます。 よって、 ***** //ご挨拶の星線分 100 //子配列の要素 200 //子配列の要素 //全て出し切ったので、ようやく子配列1はforeachに解放されます。 そして、次の子配列2へと処理が移ります。 (以下、同様です。) この点を正確に認識されれば、おそらく、 正解に辿り着くのは、時間の問題では!と思います。 がんばってみて下さい^^ 分からなければ、改めて補足致します。(たぶんw

関連するQ&A

  • foreach文の使い方を教えて下さい

    foreach文を使って表示させる時に、通し番号も一緒につけたいのですが方法がわかりません。 $msgをaaa,bbb,ccc,ddd,eeeとした時、 $msg_array = explode(",", $msg);//カンマ区切りでばらす foreach($msg_array as $message){ $comment = "コメント★【" .$message. "】<br>"; } echo "コメント一覧<br>" .$comment. "<br>ここまで\n"; という感じで書いてみましたが、★の部分に通し番号をつけて、 コメント一覧 コメント0【aaa】 コメント1【bbb】 コメント2【bbb】  (以下指定した数の分だけリピート) ここまで のように表示させたいのです。 $msgに渡した要素の数だけリピートされますが、通し番号も合わせて表示できないでしょうか? ○回分だけリピートする、という指定用に変数を増やしても構いません。 PHPはあまり詳しくなく、サンプルを少しずつ修正して使っている程度です(>_<) よろしくお願いします。

    • ベストアンサー
    • PHP
  • forEachをIEで使う方法はありますか?

    下記のコードは、javascriptのforEachを使って、配列の要素に対して順に処理をしていくものです。 forEachはFirefoxやChromeには対応していてInternetExprolerでは対応していないところまでは 調べて分かったのですが、その対策が分かりませんでした。 InternetExprolerでも動かすためにはどのようにしたらよいのでしょうか。 <html lang="ja"> <head> <title>テスト</title> </head> <body> <script type="text/javascript"> function aaa() { var ary = ["1", "2", "3"]; ary.forEach(bbb); function bbb(ccc) { alert(ccc); } } aaa(); </script> </body> </html>

  • 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の疑問

    <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
  • ランダム表示させたあとその結果を受け取るには?

    小テストのプログラムを作っています。6問ある問題の中からランダムに5問を出題させて、合計点と正解数を表示させることができました。 ただこのままでは回答者はどの問題を間違えたのかがわからないので、出題された問題と解説文を表示させたいのです。 解決のヒントをお願いいたします。 //問題文のページ <FORM method="POST" action="answer.php"> <?php $QA[]=array( "Q"=>array("id"=>"q1","text"=>"質問A") ,"A"=>array( array("key"=>1,"text"=>"回答A-1") ,array("key"=>2,"text"=>"回答A-2") ,array("key"=>3,"text"=>"回答A-3") ,array("key"=>4,"text"=>"回答A-4") ) ); . . . . $QA[]=array( "Q"=>array("id"=>"q6","text"=>"質問F") ,"A"=>array( array("key"=>1,"text"=>"回答F-1") ,array("key"=>2,"text"=>"回答F-2") ,array("key"=>3,"text"=>"回答F-3") ,array("key"=>4,"text"=>"回答F-4") ) ); shuffle($QA); $q_no=1; foreach($QA as $arr1){ shuffle($arr1["A"]); print "問".$q_no." ".$arr1["Q"]["text"]."<br>\n"; foreach($arr1["A"] as $arr2){ $id=$arr1["Q"]["id"]."_".$arr2["key"]; print "<INPUT type=\"radio\" id=\"".$id."\" name=\"".$arr1["Q"]["id"]."\" value=\"".$arr2["key"]."\"><label for=\"".$id."\">".$arr2["text"]."</label><br>\n"; } if($q_no >= 5){ break; } $q_no++; } ?> <INPUT type="submit" value=" OK " name=namae> //解答のページ <?php $tokuten = 0; $seikaisuu = 0; $answer = $_POST["q1"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = +1; } $answer = $_POST["q2"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q3"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q4"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q5"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } $answer = $_POST["q6"]; if($answer == "1"){ $tokuten = $tokuten+5; $seikaisuu = $seikaisuu+1; } print "正解数 " . $seikaisuu . "問"; print "<br>"; print "合計点 " . $tokuten . "点"; ?>

    • ベストアンサー
    • PHP
  • 2つの配列を比較し、一致しないのを得たいのですが

    連想配列 $foo = array( "aaa" => "111", "bbb" => "222", "ccc" => "333" ); と 一般配列 $bar = array( 0 => "aaa", 1 => "bbb" ); がある場合に、$iを数字として、 $fooのkey部と$bar[$i]の値が一致したら(つまり、例えばaaa)、 $fooの中のその部分は除去するような事がやりたいのですがどのようにすればいいのでしょうか? 色々試してみましたが、自分には全く出来ませんでした。 除去ではなく、新しい配列に $hoge = array( "ccc" => "333" ) のような形で入れ込むのでもいいのですが、とくかく$hogeのような配列を手に入れたいと考えております。 アドバイス頂けないでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • whileの$_とforeachの$_の関係

    以下のコードにおけるwhileとforeachでの$_の使いかたについて教えてください。 my @foos = qw( a b ); sub foo1 {   open FH, "foo.txt";   while (<FH>) {     chomp;     print "$_";   } #  while (my $x = <FH>) { #    chomp $x; #    print "$x"; #  }      print "\n"; } sub foo2 {   foreach (@foos) {     print "<$_>";     foo1();   }   print "\n"; } foo2(); foo2(); このコードと同じディレクトリに以下のような内容のfoo.txtをおいて実行します。 x y すると、以下のような結果が得られました。 <a>xy <b>xy <>xy <>xy 一回目のfoo2で@foosの内容が消えてしまいます。一方、コメントアウトしてあるようにwhileに変数($x)を使うと期待したとおりの結果が出ます。なぜ、このような結果になるのでしょうか。ご存知の方がいらっしゃったら教えてください。宜しくお願いします。ちなみに、WinXP + ActivePerl(v5.8.6)で試しました。

    • ベストアンサー
    • Perl
  • foreach構文をwhile構文で実現したい。

    下記にありますforeach構文をwhile構文で実現しようと試みているのですが 何故か同じように実現できず、無限ループになっているような気がします。 どこに問題があるのか当方ではわからない為、どなたかご教授いただけませんでしょうか。 ------------------------------ $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD ------------------------------ ■成功版 open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { chomp; ($a, $b) = split(/<>/, $_);#$_は省略できます。 print OUT "'$a'=>'$b',\n"; } close(OUT); ■取組版 open(IN, "<list1.txt"); @datas2 = <IN>; close(IN); open(OUT, ">date2.txt"); while (@datas2) { s/^/'/; s/<>/'=>'/; s/$/',/; print OUT; } close(OUT);

    • ベストアンサー
    • Perl
  • sortに関する質問

    いつもお世話になっております。 書籍でperlを独習しているものです。 質問内容が長くなってしまいますが、お付き合いいただければ幸いです。 @array=("bbb","aaa","ccc"); @list=sort @array; count=0; foreach $value(@list){ printf "%d":"[%s]\n",$count,$value; $count++; } このコードの9行目のprintfですが、 printの後の"f"の意味について教えて下さい。 今まで学んできたものは、全てprintとしか入力していなかったので、 何の説明もなしに出現して困惑しています。 又、printf以降の"%d":"[%s]\n",$count,$value; も理解できません。 コマンドプロンプトでの出力結果は 0:[aaa] 1:[bbb] 2:[ccc] となりました。 以上、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • aaa.csvとbbb.csvを条件で抽出して並べたいです。

    aaa.csvとbbb.csvを条件で抽出して並べたいです。 $array = file("aaa.csv"); foreach($array as $line){ $line = explode("," , $line); if($line[1] == "0"){ $array = file("bbb.csv"); foreach($array as $item){ $item = explode("," , $item); if($item[2] == $line[0]){ $menu = $item[5]; } } } } aaa.csvの$line[1]が「0」のときbbb.csvの$item[2]と$line[0]が一致するものを表示させたいです。 素人ですいませんが教えてください。

    • 締切済み
    • PHP