• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:共通項を持つ配列同士を結合させるには)

配列の結合方法と解説

このQ&Aのポイント
  • 複数の配列を共通項ごとに結合させるためには、条件分岐を使用する必要があります。具体的には、親の配列と子の配列の要素を比較し、一致する要素を取得します。
  • まず、親の配列の要素をループで取得し、その要素と一致する子の配列の要素を取得します。一致する要素が存在する場合は、該当する要素を表示します。
  • この方法で親の配列と子の配列を結合させることができます。条件分岐を使いながら結合処理を行うことで、目的の結果を得ることができます。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

元の構造がだいぶおかしいですが、これがデフォルトとなるなら 一度変換テーブルを作成するといいでしょう。 ($itemを$itemsに変換) <? $category = Array( Array("category_id"=>"1","category_name"=>"果物") ,Array("category_id"=>"2","category_name"=>"野菜") ); $item=Array( Array("item _id"=>"3","item_name"=>"バナナ","parent_id"=>"1") ,Array("item _id"=>"4","item_name"=>"リンゴ","parent_id"=>"1") ,Array("item _id"=>"5","item_name"=>"キャベツ","parent_id"=>"2") ,Array("item _id"=>"6","item_name"=>"トマト","parent_id"=>"2") ); foreach($item as $array){ $items[$array["parent_id"]][]=$array; } foreach($category as $category1){ print "<h2>{$category1["category_name"]}</h2>\n"; foreach((array) $items[$category1["category_id"]] as $item1){ print "<p>{$item1["item_name"]}</p>\n"; } } ?>

luckertomo
質問者

補足

yambejp様 早急なご回答ありがとうございます。 早速、ご教示頂いた内容を勉強させていただきます。 一点だけ分からないのですが、 foreach((array) $items[$category1["category_id"]] as $item1){ の部分の(array)とは、どの様な意味合いなのでしょうか。 この様な記述方法は初めて見ましたので、見当がつきません。 勉強不足でご迷惑をおかけしますが、よろしくご教示お願いします。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>(array)とは、どの様な意味合いなのでしょうか。 それはエラー回避のおまじないです。 たとえば、以下のようにすると <? foreach((array) $a as $val){ print $val; } foreach( $a as $val){ print $val; } ?> 下の方がエラーになるのがわかると思います。 foreachでデータを回す時には(array)をつけてやることで エラーが防げるのです。 今回のケースだと <? $category = Array( Array("category_id"=>"1","category_name"=>"果物") ,Array("category_id"=>"2","category_name"=>"野菜") ,Array("category_id"=>"3","category_name"=>"肉") ); $item=Array( Array("item _id"=>"3","item_name"=>"バナナ","parent_id"=>"1") ,Array("item _id"=>"4","item_name"=>"リンゴ","parent_id"=>"1") ,Array("item _id"=>"5","item_name"=>"キャベツ","parent_id"=>"2") ,Array("item _id"=>"6","item_name"=>"トマト","parent_id"=>"2") ); foreach($item as $array){ $items[$array["parent_id"]][]=$array; } foreach($category as $category1){ print "<h2>{$category1["category_name"]}</h2>\n"; foreach($items[$category1["category_id"]] as $item1){ print "<p>{$item1["item_name"]}</p>\n"; } } ?> というようにカテゴリだけしかないものを処理しようとすると エラーになりますので、そういう対策です。

luckertomo
質問者

お礼

yambejp様 早急かつ的確なご回答ありがとうございました。 理想通りの結果を得られて大変満足しています。 以下が、ご教示頂いた内容を踏まえて作成した内容になります。 //--------------------------------------------------------------- <?php function write_cat_list($title_tag,$title_before,$title_after){ $category = Array( Array("category_id"=>"1","category_name"=>"果物") ,Array("category_id"=>"2","category_name"=>"野菜") ,Array("category_id"=>"3","category_name"=>"肉") ); $item=Array( Array("item_id"=>"3","item_name"=>"バナナ","parent_id"=>"1") ,Array("item_id"=>"4","item_name"=>"リンゴ","parent_id"=>"1") ,Array("item_id"=>"5","item_name"=>"キャベツ","parent_id"=>"2") ,Array("item_id"=>"6","item_name"=>"トマト","parent_id"=>"2") ); foreach($item as $array){ $items[$array["parent_id"]][]=$array; } foreach($category as $category_val){ $title_name = $category_val["category_name"]; $title_id = $category_val["category_id"]; if(!$items[$title_id]){ print "<$title_tag id=\"titile_$title_id\" class=\"title\">$title_before$title_name$title_after</$title_tag>\n"; print "<ul>\n<li>No Item</li>\n</ul>\n"; } if($items[$title_id]){ print "<$title_tag id=\"titile_$title_id\" class=\"title\">$title_before$title_name$title_after</$title_tag>\n"; print "<ul id=\"list_$title_id\" class=\"cat_list\">\n"; foreach($items[$title_id] as $items_val){ $list_name = $items_val["item_name"]; $list_id = $items_val["item_id"]; print "<li id=\"list_$list_id\">$list_name</li>\n"; } print "</ul>\n"; } } }//end function; ?> <?php write_cat_list('h2', 'Category:', 'のリスト'); ?> //--------------------------------------------------------------- それでは、今回はこれで質問を締め切らせていただきます。 yambejp様、お忙しい中ご教示頂きましてありがとうございました。

luckertomo
質問者

補足

yambejp様 ご教示頂いた内容を、var_dumpを使い確認しながら勉強させていただきました。 >foreach($item as $array){ >$items[$array["parent_id"]][]=$array; >} 当初、このforeach内の一行だけで、なぜカテゴリーID別に配列に格納される のかが理解できませんでしたが、var_dumpでそれぞれの配列の内容を見なが ら検証し、理解することができました。 配列のkeyに結び付けたい配列のID値を指定する事で、共通のIDを持った配列 を処理していくのですね。なるほど・・感服しました。 正にこの部分で生成される配列を作りたく、色々と条件分岐させ、 array_combine()、array_fill_keys()、array_push()、compact()など 配列を結合させる関数を調べては試したのですが、思うような結果にならず に困っていました。勉強不足で応用がきかず、この様な書き方と考え方が全 く思い浮かびませんでした。 エラー回避の(array)の部分も、勉強になりました。 特にエラー時の処理がいらない場合には、こういう回避策があったのですね。 ただ、今回はカテゴリだけの場合も考えられるので、(array)は使わずに if文で条件分岐させて処理しようと思います。

関連するQ&A