• ベストアンサー

php 2つの配列の内、片方を元にして、1つの配列にしたい

Data AとData Bをもとに Data Cを作成したいのです。 ※DataAに無くても、DataBにあるものはDataCに格納したい。 *Data A* ---------------------------- index | indexA | Name ---------------------------- 1    100   A_Test1 2    101   A_Test2 3    102   A_Test3 4    103   A_Test4 5    104   A_Test5 6    105   A_Test6 7    106   A_Test7 *Data B* ---------------------------- index | indexA | flg ---------------------------- 11   100   1 12   101   0 13   102   1 14   103   1 15   104   1 16   106   0 *Data C* indexAをkeyに結合 ------------------------------- index | ndexA | Name | flg ------------------------------- 1    100  A_Test1  1 2    101  A_Test2  0 3    102  A_Test3  1 4    103  A_Test4  1 5    104  A_Test5  1 6    NULL  A_Test6  0 7    106  A_Test7  0 arrayDataA = Array( [0] => Array([indexA]=> 100 [Name] = A_Test1           [1] => Array([indexA]=> 101 [Name] = A_Test2           [2] => Array([indexA]=> 102 [Name] = A_Test3           [3] => Array([indexA]=> 103 [Name] = A_Test4           [4] => Array([indexA]=> 104 [Name] = A_Test5           [5] => Array([indexA]=> 105 [Name] = A_Test6           [6] => Array([indexA]=> 106 [Name] = A_Test7          )) arrayDataB = Array( [0] => Array([indexA]=> 100 [flg] = 1           [1] => Array([indexA]=> 101 [flg] = 0           [2] => Array([indexA]=> 102 [flg] = 1           [3] => Array([indexA]=> 103 [flg] = 1           [4] => Array([indexA]=> 104 [flg] = 1           [5] => Array([indexA]=> 106 [flg] = 1          )) というところまで格納するこはできたのですが この、arrayDataAとarrayDataBを元に arrayDataCを作成したいのです。 初歩的なことかと思いますが、 どのように、プログラムを書くと実現できるのでしょうか? よろしくお願いいたします。

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

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

なんか非効率的な書き方かもしれませんが、こんな感じでどうでしょう? これであれば$arrayDataAか$arrayDataBのどちらかに存在すれば $arrayDataCに収めることができます <? $arrayDataA = Array( '0' => Array('indexA'=> '100', 'Name' => 'A_Test1') ,'1' => Array('indexA'=> '101', 'Name' => 'A_Test2') ,'2' => Array('indexA'=> '103', 'Name' => 'A_Test4') ); $arrayDataB = Array( '0' => Array('indexA'=> '100', 'flg' => '1') ,'1' => Array('indexA'=> '101', 'flg' => '0') ,'2' => Array('indexA'=> '102', 'flg' => '1') ); $arrayDataC=Array(); foreach($arrayDataA as $key=> $array){$indexAlist[$array['indexA']]['AKey']=$key;} foreach($arrayDataB as $key=> $array){$indexAlist[$array['indexA']]['BKey']=$key;} ksort($indexAlist); $count=1; foreach($indexAlist as $key=> $array){ $C=&$arrayDataC[$count++]; $C['indexA']=$key; $C['Name']=$arrayDataA[$array['AKey']]['Name']; $C['flg']=$arrayDataB[$array['BKey']]['flg']; } print "<pre>"; print_r($arrayDataC); print "</pre>"; ?> ちなみに要件のなかに$arrayDataCは1から始まるような指定があったので そのように対応しましたが、ふつうは配列は0からはじまります

dreamwave
質問者

お礼

yambejpさま 誠にありがとうございます。 配列の操作に不慣れというあって大変、参考になります。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

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

仕様定義がおかしくないですか? >※DataAに無くても、DataBにあるものはDataCに格納したい。 と書いてありますが、実際には DataBに無くても、DataAにあるものを表示していますし、しかも >6    NULL  A_Test6  0 となっていますが 6    105  A_Test6  NULL ではないのですか? 私の理解がおかしいのかもしれませんが、仕様うがはっきり していないと回答がブレるので・・・

dreamwave
質問者

補足

yambejpさま ありがとうございます。 すみません。おっしゃる通りです。 矛盾しておりました。 誤)6    NULL  A_Test6  0 正)6    105  A_Test6  NULL としたいのです。 DataBに無くても、DataAにあるものを表示したい。 つまり、DataAをベースに行いたいのです。

すると、全ての回答が全文表示されます。
  • kichiwave
  • ベストアンサー率41% (10/24)
回答No.1

泥臭いですが arrayDataAをforeachで回しながら arrayDataAのデータをarrayDataCにコピーする そのforeach文の中でarrayDataBをforeachでまわして arrayDataBの中にarrayDataAと同じindexAがあるか調べて 無ければarrayDataCのindexAをnullにする 二重ループの中でif文を書く って形でやればできると思います できればarrayDataBのforeachは関数にした方が 見栄えはきれいになっていいと思います。 二重ループは見栄えがよくないので

dreamwave
質問者

お礼

kichiwaveさま ありがとうございます。 要求仕様が矛盾しておりましたが、アドバイスありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A