• ベストアンサー

foreachで上限回数指定方法または別の解決策を・・・

こんにちは。 以下のような多次元の配列があるとして… $test["aa"]["name"] = "名前1"; $test["aa"][mail] = "メール1"; $test["bb"]["name"] = "名前2"; $test["bb"][mail] = "メール2"; $test["cc"]["name"] = "名前3"; $test["cc"][mail] = "メール3"; $test["dd"]["name"] = "名前4"; $test["dd"][mail] = "メール4"; foreach($test as $key => $val){ echo $key; echo $test[$key]["name"]; echo $test[$key]["mail"]; } とすると、1番目のキー・名前・メールアドレスのセットが4つ出力されてしまいますが、これに最大出力限度数を指定し、2などに制限したいです。 foreachでループ回数上限を指定する事は可能でしょうか? また、他にも上記のような処理が可能な方法があれば教えて下さい。

  • anbsd
  • お礼率85% (18/21)
  • PHP
  • 回答数4
  • ありがとう数13

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

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

foreach自身が、『すべて』繰り返しですから、単体では無理ですね。 やるとすれば、カウンタ変数を別に用意してbreak;でループを中断ですかね。 $i=0; foreach($test as $key => $val){ if (1<$i){//実際には($i=2)でも可 break; } $i++; やりたい処理 } 関係ないけど気になったこと。 echo $test[$key]["name"]; echo $test[$key]["mail"]; 普通はこうですね echo $val["name"]; echo $val["mail"];

anbsd
質問者

お礼

お礼が遅くなってすみません。 お返事と指摘ありがとうございます。 間違って覚えていたようです…。 ランダムはDBから取得時にDBにやらせる形で解決し、breakを使う方法を試してみた所、思った通りの動作をしました。 ありがとうございます。

その他の回答 (3)

  • mpx
  • ベストアンサー率71% (149/209)
回答No.4

> foreach($test as $key => $val){ > echo $key; > echo $test[$key]["name"]; > echo $test[$key]["mail"]; > } 上記を下記に変更するだけでも良いかと・・ $keyArray = array_rand($test,2);//2に制限の例 foreach($keyArray as $key){ echo $key; echo $test[$key]["name"]; echo $test[$key]["mail"]; }

anbsd
質問者

お礼

お返事ありがとうございます。 array_rand、使用したことがなかったのですが、試してみた所、大変便利な関数ですね。 新しい知識をありがとうございます。

noname#111181
noname#111181
回答No.3

ANo.1で回答した者です。お礼メッセージをありがとうございます。 ランダムに取り出したいということですので、下記のようになります。 $test["aa"]~["dd"]のキーを別の配列$tmp[]にコピーして、そしてシャッフルします。シャッフルした結果から2つ取り出すようにしています。 -------------------------------- <?php $test["aa"]["name"] = "名前1"; $test["aa"]["mail"] = "メール1"; $test["bb"]["name"] = "名前2"; $test["bb"]["mail"] = "メール2"; $test["cc"]["name"] = "名前3"; $test["cc"]["mail"] = "メール3"; $test["dd"]["name"] = "名前4"; $test["dd"]["mail"] = "メール4"; $tmp = array(); //シャッフル用の配列 $i = 0; foreach($test as $key=>$val) { $tmp[$i] = $key; $i++; } shuffle($tmp); //配列をシャッフル for ($i = 0; $i < 2; $i++) { $key = $tmp[$i]; echo $key; echo $test[$key]["name"]; echo $test[$key]["mail"]; } ?>

anbsd
質問者

お礼

お返事ありがとうございます。 お礼が遅くなってすみません、上記コードを参考に自分なり試してみた所、実行出来ました。 今回は#2に記載した方法で解決しましたが、新しい知識が増えました。 ありがとうございました。

noname#111181
noname#111181
回答No.1

要求要件が分からないので教えて下さい。 ご質問のサンプルスクリプトですと、$test["aa"]~["dd"]の4つのうちから、ランダムに2つをとりだして表示したいと考えておられますか? それとも、常に$test["aa"]~["bb"]の2つを表示したいと考えておられますか? お知らせください。

anbsd
質問者

お礼

お返事ありがとうございます。 ランダムに取得したいと考えています。

関連するQ&A

  • 文字列の置き換えについて

    下記のようなテキストファイルを読み込みます。 【お名前】 {@name} 【フリガナ】 {@kana} 【年齢】 {@age} そしてphpでこのようにしました。 $test = array( 'name' => '名前太郎', 'kana' => 'ナマエタロウ', ); $file = 'body.txt'; $body = file_get_contents($file); foreach ($test as $key => $val) { if ( is_array( $val ) ) { foreach ( $val as $val2 ) { $body = preg_replace( "/{@$key}/u", implode(',', $val), $body ); } } else { $body = preg_replace( "/{@$key}/u", $val, $body ); } } echo $body; 結果は、@nameと@kanaは配列にある通りの文字列に変わりますが@ageは そのまま表示されてしまいます。 $testの配列で該当するパターンがない場合には@hogeの値を空白にしたいのですが どうすればいいでしょうか? foreachを$testで行っているのでループ内ではできないような気がしています。 いい方法があれば教えてください!

    • ベストアンサー
    • PHP
  • テーブルデータ表示

    mysqlからデータをphpで取得し以下のような多次元配列になっています。 Array ( [0] => Array ( [id] => 116 [name] => あああ ) [1] => Array ( [id] => 58 [name] => いいい ) [2] => Array ( [id] => 89 [name] => ううう ) ) 単純にデータを表示させたく以下のようにしましたが<th>$key2</th>の箇所が上記配列の場合 2回繰り返されて表示されてしまいます。ここはフィールド名なので1回の表示でいいのですが どのように記述すれば思うような表示になるでしょうか? echo "<table border=\"1\">"; echo "<tr>"; foreach ($tmp1 as $key => $val) { foreach ($val as $key2 => $val2) { echo "<th>" . $key2 . "</th>"; //フィールド名 } } echo "</tr>"; foreach ($tmp1 as $key => $val) { echo "<tr>"; foreach ($val as $key2 => $val2) { echo "<td>" . $val2 . "</td>"; // 取得したデータをある分だけ繰り返し } echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP
  • シェルの配列

    シェルで2つの配列の同じ位置の文字を同時にチェックしようとして以下のコードを組みましたが、上手くいきません。$dd中の文字が配列として扱われていないのはなぜだか教えていただけますか? #! /bin/csh -f set AA="18" set BB="20" set cc = "11 12 18 19" set dd = "24 22 20 21" @ idx = 1 foreach h_code ( $cc ) echo [$AA][$h_code][$BB][$dd[$idx]]     # ccの1個目とddの1個目をそれぞれ$AA,$BBと比較 if( $AA == $h_code && $BB == $dd[$idx] ) then echo "OK" endif @ idx++ end

  • select boxで指定した箇所に飛ぶ方法

    formで選んだ箇所に単純にaタグで飛ばす方法はあるでしょうか。 <form method="??" action=""> <select name="abc"> <option value="aa"><a href="aa">aa</a></option> <option value="bb"><a href="bb">bb</a></option> <option value="cc"><a href="cc">cc</a></option> <option value="dd"><a href="dd">dd</a></option> <option value="ee"><a href="ee">ee</a></option> </select> <input type="submit" value="そこに飛ぶ"> </form> submitを押すとそこのaタグに飛ばすようにしたいのですが。 html初心者で困っております。 よろしくお願いします。

    • ベストアンサー
    • HTML
  • SQL構文を手助けしてください

    (1)のようなテーブルデータを(2)のように表示したいと思います。 AA,BB,CC,DD,EEは列名としてください。 (1) AA BB CC DD EE __________________________ 00 01 2004/01/01 XX YY 01 00 2004/01/01 XE YD 01 00 2004/01/05 XZ YZ 02 01 2004/01/10 X2 YE 02 02 2004/01/05 XW YI 02 02 2004/01/06 XF YL (2) AA BB CC DD EE __________________________ 00 01 2004/01/01 XX YY 01 00 2004/01/05 XZ YZ 02 01 2004/01/10 X2 YE 02 02 2004/01/06 XF YL <条件> AAとBBでキーを作り、CCのMAXの該当レコードを表示したい。 SELECT AA,BB,MAX(CC),DD,EE FROM TEST_TABLE GROUP BY AA,BB というような感じかなと思ったのですが、「GROUP BY の式ではありません」と怒られてしまいます。 どなたか簡単なやり方をご存知で無いでしょうか?

  • 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
  • 添え字が表示できない

    simplexml_load_fileでXMLデータを解析して、ある添え字を表示したいのですが上手く表示されません。 (PHPバージョンは5です) 解析結果 ++++++++++++++++++++ SimpleXMLElement Object (  [A] => SimpleXMLElement Object   (    [B] => Array     (      [0] => SimpleXMLElement Object       (        [aa] => あいうえお        [bb] => かきくけこ        [cc] => さしすせそ       )      [1] => SimpleXMLElement Object       (        [dd] => たちつてと        [ee] => なにぬねの        [ff] => はひふへほ       )      [2] => SimpleXMLElement Object       (        [gg] => まみむめも        [hh] => やゆよ        [ii] => らりるれろ       )   <以下省略> ++++++++++++++++++++++++++++++++++++++++ この、0,1,2,・・・を表示させたくて foreach($xml->A->B as $key => $val){   echo "[$key},"; } としても、「0,1,2,」ではなく 「B,B,B,」と表示されてしまいます。 「0,1,2,」と表示させるにはどう記述すればよいのでしょうか??

    • ベストアンサー
    • PHP
  • php foreach 配列のソート方法

    配列のソート方法の仕方がわからず調べているのですが、なかなかできず困っております。 どなたかご教授お願いいたします。 array(5) { [0]=> array(3) { ["id"]=> string(1) "1" ["size"]=> string(5) "100" ["message"]=> string(7) "テスト1" } [1]=> array(3) { ["id"]=> string(1) "2" ["size"]=> string(5) "200" ["message"]=> string(7) "テスト2" } [2]=> array(3) { ["id"]=> string(1) "3" ["size"]=> string(5) "300" ["message"]=> string(7) "テスト3" } [3]=> array(3) { ["id"]=> string(1) "4" ["size"]=> string(5) "400" ["message"]=> string(7) "テスト4" } [4]=> array(3) { ["id"]=> string(1) "5" ["size"]=> string(4) "500" ["message"]=> string(7) "テスト5" } [5]=> array(3) { ["id"]=> string(1) "6" ["size"]=> string(5) "600" ["message"]=> string(7) "テスト6" } } foreach ($data as $key => $val) { ・ ・ ・ } となっております。foreachでループさせたときにidの降順?(1→6に表示)になるのですが、sortで昇順?(6→1に表示)にしたいです。 お分かりの方がいらっしゃいましたらお願いいたします。

    • 締切済み
    • PHP
  • CLASSPATHと環境変数について

     Java初心者です、宜しくお願いします。  SJC-Pの問題です、以下の問題の意味が分かりません。 <問題>  現在CLASSPATH環境変数に設定されているパスが/AA/BBとします。  Testクラスが/AA/BB/CC/DDにあり、カレントディレクトリが/AAである場合、 次のプログラムTestが正しく実行される回答を選べという問題があります。  ===================================================  Package CC.DD ;  public class Test {   public static void main (String[] args) {  System . out . print(“java”) ;  }  }  ===================================================  答えは「java CC . DD . Test」なのですが、「現在CLASSPATH環境変数に設定されている パスが/AA/BBとします。」という意味が理解できません。  「現在CLASSPATH環境変数に設定されているパス」とはどのような意味でしょうか。  現在フォルダは、/CC/DDしか作成されていないという意味でしょうか、それにしても、 設問は「Testクラスが/AA/BB/CC/DDにあり」と書かれていることから、既にCC/DDフォルダ は、 BBフォルダの直下に作成されていると考えるのが正しいと思うのですが。  そもそも、「現在CLASSPATH環境変数に設定されているパス」とは、どのような意味を持つ のでしょうか。  以上宜しくお願いします。

    • ベストアンサー
    • Java
  • 変数に改行を含む文字列を代入

    変数に改行を含む文字列を代入したいです。 具体的には echo $KAIGYO AA BB CC DD となるような $KAIGYOを作りたいです。 どのようにしたらよいでしょうか?

専門家に質問してみよう