![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
共通項を持つ複数の配列同士を結合させたいのですが、どうしても思った結果にならずに困っています。よろしくご教示下さい。
例えると、「果物」「野菜」という親の配列、「バナナ」「リンゴ」「キャベツ」「トマト」という子の配列があり、結果を以下のように表示させたいと考えています。
<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
}
色々と条件分岐させてみたのですが、理想の結果になりません。
できれば、多少解説を付けながらご教示頂けると幸いです。
よろしくお願いします。
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";
}
}
?>
この回答への補足
yambejp様
早急なご回答ありがとうございます。
早速、ご教示頂いた内容を勉強させていただきます。
一点だけ分からないのですが、
foreach((array) $items[$category1["category_id"]] as $item1){
の部分の(array)とは、どの様な意味合いなのでしょうか。
この様な記述方法は初めて見ましたので、見当がつきません。
勉強不足でご迷惑をおかけしますが、よろしくご教示お願いします。
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";
}
}
?>
というようにカテゴリだけしかないものを処理しようとすると
エラーになりますので、そういう対策です。
この回答への補足
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文で条件分岐させて処理しようと思います。
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様、お忙しい中ご教示頂きましてありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- アプリ Android studio 初心者 Hello Android!しか表示されない 1 2023/08/01 08:47
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- PHP ワードプレスサイト PHP8.0.25でのWarningエラー 1 2023/06/12 11:44
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Java java final 1 2022/06/10 22:49
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
CArrayのソート
-
特定の文からメールアドレスの...
-
STLのvectorで作った配列をメン...
-
読み(あ行~わ行)ごとに分け...
-
Texでの数式
-
CArrayの要素としてCStringArra...
-
順位のところを画像にする方法
-
多次元配列の重複削除
-
Tableの背景色を交互に変えたい
-
PHPは何故値渡しより参照渡しの...
-
PHPのセレクトボックスの初期値...
-
array_search-配列関数の使い方
-
C言語 最大値と最小値を求めて...
-
これって何ソート?
-
mb_encode_numericentityでタグ...
-
$_SESSIONに二次元配列を使える...
-
複数行のデータのPOST処理に関して
-
自動で番号を振りたい
-
CSVデータの行数カウントをした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングのPythonのnoteb...
-
C言語の配列をPush(追加)する...
-
php で1から100までの素数の表...
-
STLのvectorで作った配列をメン...
-
スカラーのベクトル微分
-
行列
-
Perlで重複行を削除したい
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
forとかで連番の変数を一気に格...
-
C言語 最大値と最小値を求めて...
-
PHPでユニークIDを作る
-
CArrayの要素としてCStringArra...
-
fgetc関数について
-
読み(あ行~わ行)ごとに分け...
-
verilogで、配列の一部をタスク...
-
Pager::factory()の使い方がわ...
-
mallocで char *型の配列を確...
-
c言語 単位行列
-
多次元配列の重複削除
おすすめ情報