• ベストアンサー

配列のグループ別け

お世話になっております。 以下のような2つの配列があります。 各データのタブ区切りの後の数値は、$key、$menuのデータを紐付けるためのものです。 $key = array("スキー\t1", "スノーボード\t1", "アイススケート\t1", "ダイビング\t2", "サーフィン\t2", "野球\t3", "サッカー\t3"); $menu = array("ウィンタースポーツ\t1", "マリンスポーツ\t2", "チームプレー\t3"); この2つの配列を$menuにある各データ単位でグループ別けして表示させたいと考えていますが、for文の乱用になってしまっており、願った表示を得ることが出来ません。 ウィンタースポーツ  スキー スノーボード アイススケート マリンスポーツ  ダイビング サーフィン チームプレー  野球 サッカー 以上、このように表示させるにはどのようにすれば宜しいのでしょうか。 お忙しいなか恐縮ですが、アドバイスのほど頂戴出来れば幸いです。宜しくお願い申し上げます。

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

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

んー、まぁ、なんとなくタブ区切りである事に意味があるんだろうとは思いましたが、 配列が変えられないとなると、そちらが言ってるように「for文の乱用」って事になりますかねぇ。。 まぁ、乱用か適正かは状況によるので判断しかねますが、for文で総当りが 思い浮かびますね。 <? $key = array("スキー\t1", "スノーボード\t1", "アイススケート\t1", "ダイビング\t2", "サーフィン\t2", "野球\t3", "サッカー\t3"); $menu = array("ウィンタースポーツ\t1", "マリンスポーツ\t2", "チームプレー\t3"); foreach($menu as $i => $dat01) { list($Category , $c_key) = explode("\t" , $dat01); print "● $Category<hr>"; foreach($key as $j => $dat02) { list($Sports , $s_key) = explode("\t" , $dat02); if ($c_key == $s_key) { print "$Sports "; } } print "<hr>"; }

a4_chapp
質問者

お礼

bm_hiro様 こんにちは。引続きご親切な対応をありがとうございます。 凄くスマートにまとまっている気がします。私の場合、本当に「乱用」でしたので。。 もちろん、無事願っている結果を得ることが出来ました。 勉強になります。ありがとうございました。

その他の回答 (2)

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

私ならこちらの方法を選ぶという別の例を $menu = array( array("title"=>"ウィンタースポーツ","key"=>array("スキー","スノーボード","アイススケート")) ,array("title"=>"マリンスポーツ","key"=>array("ダイビング","サーフィン")) ,array("title"=>"チームプレー","key"=>array("野球","サッカー")) ); echo array[0]["title"];//"ウィンタースポーツ"が表示される foreach (array[0]["key"] as $sports){ echo $sports; //"スキー","スノーボード","アイススケート"と順に表示される } echo array[1]["title"];//"マリンスポーツ"が表示される ※実際は、0,1はforループで回すことになります。 もしくは、ちょっとシンプルに 下記で子の配列内の1番目(Index=0)は、メニューって仕様にする $menu = array( array("ウィンタースポーツ","スキー","スノーボード","アイススケート") ,array("マリンスポーツ","ダイビング","サーフィン") ,array("チームプレー","野球","サッカー") ); for($i=0;$i<count($menu);$i++){ echo $menu[$i][0]."<br />"; //メニュータイトルが表示される for($j=1;$j<count($menu[$i]);$j++){ //※初期値は1 echo $menu[$i][$j]; //各スポーツ名称が表示される } }

a4_chapp
質問者

お礼

BellBell様 こんばんは。早々のご親切な対応をありがとうございます。 #1様へのお挨拶でも述べたのですが、配列の中身を変更することがとても難しい状況です。 配列を変更することなく、結果を求めることは難しいでしょうか。 お忙しいなか恐縮ですが宜しくお願い申し上げます。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

若干、配列の中身を変えましたし、かなり ざっくり書いてますので、ご了承ください。 //----------------------------------- <? $key = array("スキー" => 1 , "スノーボード" => 1 , "アイススケート" => 1 , "ダイビング" => 2 , "サーフィン" => 2 , "野球" => 3 , "サッカー" => 3); $menu = array(1 => "ウィンタースポーツ", 2 => "マリンスポーツ", 3 => "チームプレー"); foreach($menu as $i => $Category) { print "$Category<hr>"; print_r(array_keys($key , $i)); print "<hr>"; } ?> //-----------------------------------

a4_chapp
質問者

お礼

bm_hiro様 早々のアドバイスをありがとうございます。 ソースまでご提示いただきありがとうございます。 ところで、配列の中身を変えることなく結果は得ることは、やはり難しいのでしょうか。 ご提示いただいたソースを実行すると、「なるほど・・」とはいくのですが、配列の中身を変更することが難しいのです。 今一度、配列の中身を変更する方向で試してみますが、配列を変更することなく出来る方法があれば有り難く思っております。

関連するQ&A

専門家に質問してみよう