こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

共通項を持つ配列同士を結合させるには

共通項を持つ複数の配列同士を結合させたいのですが、どうしても思った結果にならずに困っています。よろしくご教示下さい。

例えると、「果物」「野菜」という親の配列、「バナナ」「リンゴ」「キャベツ」「トマト」という子の配列があり、結果を以下のように表示させたいと考えています。

<h2>果物</h2>
<p>バナナ</p>
<p>リンゴ</p>

<h2>野菜</h2>
<p>キャベツ</p>
<p>トマト</p>

それぞれの配列の内容は、以下の様になっています。

$category = //親の配列
array(3) {
["category_id"]=>
string(1) "1"
["category_name"]=>
string(6) "果物"
["parent_id"]=>
string(1) "0" //親のid 親の場合は"0"
}

array(3) {
["category_id"]=>
string(1) "2"
["category_name"]=>
string(6) "野菜"
["parent_id"]=>
string(1) "0" //親のid 親の場合は"0"
}

$item = //子の配列
array(3) {
["item _id"]=>
string(1) "3"
["item _name"]=>
string(9) "バナナ"
["parent_id"]=>
string(1) "1" //親のid
}

array(3) {
["item _id"]=>
string(1) "4"
["item _name"]=>
string(9) "リンゴ"
["parent_id"]=>
string(1) "1" //親のid
}

array(3) {
["item _id"]=>
string(1) "5"
["item _name"]=>
string(12) "キャベツ"
["parent_id"]=>
string(1) "2" //親のid
}

array(3) {
["item _id"]=>
string(1) "6"
["item _name"]=>
string(9) "トマト"
["parent_id"]=>
string(1) "2" //親のid
}

色々と条件分岐させてみたのですが、理想の結果になりません。
できれば、多少解説を付けながらご教示頂けると幸いです。
よろしくお願いします。

投稿日時 - 2009-12-06 18:37:40

QNo.5502842

困ってます

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

元の構造がだいぶおかしいですが、これがデフォルトとなるなら
一度変換テーブルを作成するといいでしょう。
($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";
}
}
?>

投稿日時 - 2009-12-07 09:57:20

補足

yambejp様

早急なご回答ありがとうございます。
早速、ご教示頂いた内容を勉強させていただきます。

一点だけ分からないのですが、
foreach((array) $items[$category1["category_id"]] as $item1){
の部分の(array)とは、どの様な意味合いなのでしょうか。
この様な記述方法は初めて見ましたので、見当がつきません。

勉強不足でご迷惑をおかけしますが、よろしくご教示お願いします。

投稿日時 - 2009-12-08 00:16:21

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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";
}
}
?>
というようにカテゴリだけしかないものを処理しようとすると
エラーになりますので、そういう対策です。

投稿日時 - 2009-12-08 15:32:16

補足

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文で条件分岐させて処理しようと思います。

投稿日時 - 2009-12-08 18:04:55

お礼

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様、お忙しい中ご教示頂きましてありがとうございました。

投稿日時 - 2009-12-08 18:27:53

あなたにオススメの質問