• ベストアンサー

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を作成したいのです。 初歩的なことかと思いますが、 どのように、プログラムを書くと実現できるのでしょうか? よろしくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • accessのユニオンクエリについて教えてください

    accessのユニオンクエリで以下の(1)選択クエリを表(2)のように並び替えを行いたいのですが、 記述がわかりません。内容的にはコントロール名に表示されるデータを項目として使用し、また項目に対応する、文字データをひもづけて表(2)のように並び替えをしたいのです。 また、文字データはたくさん入力され1500文字程度になる場合があります。 どなたか、お分かりになる方がいらっしゃいましたら教えていただけませんか? 宜しくお願い申し上げます。 (1)選択クエリ ID 氏名   年齢  性別 コントロール名 文字データ 1 Aさん 10歳  男   項目1 文字dataA1 2 Bさん 20歳  女   項目1 文字dataB1 3 Cさん 30歳  男   項目1 文字dataC1 1 Aさん 10歳 男   項目2 文字dataA2 1 Aさん 10歳 男  項目3 文字dataA3 2 Bさん 20歳  女   項目2 文字dataB2 3 Cさん 30歳 男   項目2 文字dataC2 1 Aさん 10歳  男   項目4 文字dataA4 1 Aさん 10歳  男   項目5 文字dataA5 2 Bさん 20歳  女   項目3 文字dataB3 3 Cさん 30歳  男   項目3 文字dataC3 3 Cさん 30歳  男   項目4 文字dataC4 2 Bさん 20歳  女   項目4 文字dataB4 2 Bさん 20歳  女   項目5 文字dataB5 表(2) ID 氏名 年齢 性別 項目1 項目2 項目3 項目4 項目5 1 Aさん 10歳 男 文字dataA1 文字dataA2 文字dataA3 文字dataA4 文字dataA5 2 Bさん 20歳 女 文字dataB1 文字dataB2 文字dataB3 文字dataB4 文字dataB5 3 Cさん 30歳 男 文字dataC1 文字dataC2 文字dataC3 文字dataC4

  • テーブル結合について

    テーブルの結合についてお聞きしたいことがあります。 カラム「KEY」を結合条件に テーブルA、B、Cを結合して【取りたい結果】のようなデータを取りたいと思っています。 しかし、テーブルAにBとCをLEFT JOINを結合した所、 【取得された結果】のデータが取得されました。 どのような結合をしたら期待通りの結果が得られるのでしょうか? 回答宜しくお願いします。 【取得された結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 B-1 C-2 A-1 B-1 C-3 2 A-2 3 A-3 【取りたい結果】 key dataA dataB dataC ------------------------------------------------- 1 A-1 B-1 C-1 A-1 C-2 A-1 C-3 2 A-2 3 A-3 【テーブルA】 key dataA --------------------- 1 A-1 2 A-2 3 A-3 【テーブルB】 key dataB --------------------- 1 B-1 【テーブルC】 key dataC --------------------- 1 C-1 1 C-2 1 C-3

  • 差分バックアップだと二世代前のデータは消えますか?

    I-O DATAの外付けハードディスクを使用しています。 EasySaver3.1 LE というI-O DATAの無料ソフトを使って 前回フルバックアップをし、今回は差分バックアップを取ろうと思っています。 そこで質問ですが、差分バックアップだと二世代前のデータは消えますか? 有料ソフトだと履歴機能がありますがこの無料ソフトだと無い、と書いてありました (この履歴機能というのが何なのかよく分かってないです)。 この無料ソフトだと一世代前のデータしか残らないのですか? 例を挙げると、元々 DataA DataB DataC という三つのファイルがあってフルバックアップしたとします(一世代目)。 そして、DataAだけ消します。 DataB DataC この二つのファイルの状態で差分バックアップをします(二世代目)。 そして、今度はDataBを消します。 DataC このDataCだけの状態で差分バックアップをします(三世代目)。 ここで「DataAがやっぱり必要だった!」となった場合、DataAを復元できますか? 他のメーカ/機種での一般的な話でも構いません。 どうか教えて下さい。お願いします。

  • 配列のソート

    下記のような形でデータを取得し結果を配列に格納し、 降順にソートしたいのですが、いい方法が見つかりません。いい方法はあるでしょうか。よろしくお願いします。 テーブル構造(test) ID|name |point|area| ==================== 1 |Aさん|56 | A | 2 |Bさん|12 | B | 3 |Cさん|24 | B | 4 |Dさん|34 | B | $sql = "select * from test"; $result = mysql_query($strSQL); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { ここで配列に格納 } 配列への格納方法と、pointの降順にソートする 方法が知りたいです。 最終的に、Aさん、Dさん、Cさん、Bさんと なるようにしたいです。

    • ベストアンサー
    • PHP
  • 配列を使って値を受け取る方法で困っています(PHP)

    こんにちは、よろしくお願い致します。 現在使用している環境が2つあります。 Win2000+Apache1.3+PHP4.2.3 RedHatLinux8.0+Apache1.3+PHP4.2.3 そのうちLinux環境の方では、配列がうまく使えません。 お手数ですが、具体的な結果は test.html、test.phpのソースと実行結果をご覧下さい。 両方の環境のApacheやPHPの設定ファイルをチェックしたのですが 特に怪しいところはなく、とても困ってます。 アドバイスお願い致します。 (test.html)-- <HTML><BODY> <form action=./test.php method=post> <input type=input name=a[0] value="1"> <input type=input name=b[0] value="12"> <input type=input name=c[0] value="123"> <input type=input name=d[0] value="1234"> <input type=input name=e[0] value="12345"> <input type=input name=f[0] value="123456"> <input type=submit name=submit value="OK"> </form> </BODY></HTML> ------------ (test.php)-- <?php print_r($HTTP_POST_VARS); ?> ------------ 【 Win環境の結果 】 Array ( [a] => Array ( [0] => 1 ) [b] => Array ( [0] => 12 ) [c] => Array ( [0] => 123 ) [d] => Array ( [0] => 1234 ) [e] => Array ( [0] => 12345 ) [f] => Array ( [0] => 123456 ) [submit] => OK ) 【 Linux環境の結果 】 Array ( [a] => Array ( [0] => 1 ) [b] => Array ( [0] => 12 ) [c] => Array ( [0] => 123 ) [d] => Array ( [0] => ) [e] => Array ( [0] => 5 ) [f] => Array ( [0] => 56 ) [submit] => OK )

    • ベストアンサー
    • PHP
  • 統計の問題

    統計学の問題を解いていただきたいです。今までスマホを使って解いていましたが、故障したため、できない状態です。パソコンはありません。 この質問は友達に投稿してもらっています。 dataA = c(18.3, 16.9, 18.1, 17.7, 17.9, 17.3, 18.7, 18.3, 16.3, 15.0, 17.9, 18.2, 15.3, 18.5, 16.9, 18.4, 17.4, 17.9, 17.8, 16.3, 17.4, 17.2, 16.7, 17.4, 17.7, 15.5, 17.3, 16.3, 15.1, 16.4) dataB = c(17.8, 19.1, 18.6, 17.6, 18.7, 19.2, 15.9, 18.9, 19.1, 18.7, 13.1, 16.2, 16.8, 18.5, 18.0, 17.5, 18.4, 16.1, 18.1, 16.3, 16.5, 17.2, 18.2, 15.9, 16.0, 17.7, 18.7, 18.8, 18.2, 18.6) ① それぞれのデータにおける「平均値(算術平均)」,「自由度」,「不偏分散」を求めよ. 平均値 mean(dataA) mean(dataB) 自由度 length(dataA)-1 length(dataB)-1 計算式で出した不偏分散 sum((dataA -mean(dataA))^2)/(length(dataA)-1) sum((dataB -mean(dataB))^2)/(length(dataB)-1) ② それぞれのデータにおける「標準誤差」および「95%信頼区間」を求めよ. 標準誤差 標準偏差 / sqrt(n) sqrt(var(dataA)) / sqrt(length(dataA)) sqrt(var(dataB)) / sqrt(length(dataB)) 95%信頼区間 mean(dataA)+(qnorm(0.95) * sd(dataA)) mean(dataA)-(qnorm(0.95) * sd(dataA)) mean(dataB)+(qnorm(0.95) * sd(dataB)) mean(dataB)-(qnorm(0.95) * sd(dataB)) ③ それぞれのデータを平均0,標準偏差1のデータにZ変換せよ. ④ 5%水準において,dataAとdataBの平均値に差があるかどうか判定せよ.なお,回答には対立仮説および帰無仮説を明記すること.また「入力したコマンド」や「出力結果」を示すとともに,「判定するために読み取った場所」および「なぜそのように判定したのか」を説明すること. t.test(x=dataA,y=dataB,conf.level=0.95,var.equal=F)

  • PHPの配列について

    PHPの配列についての質問です。 以下のソースを // == ソース == function hoge( $foo ) { $arrs['a'] = 'A'. $foo; $arrs['b'] = 'B'. $foo; $arrs['c'] = 'C'. $foo; $arrs['d'] = 'D'. $foo; } hoge( '3' ); hoge( '9' ); // == /ソース == 実行すると print_rは // == print_r == Array (   [a] => A3   [b] => B3   [c] => C3   [d] => D3 ) Array (   [a] => A9   [b] => B9   [c] => C9   [d] => D9 ) // == /print_r == のようになります。 これを 関数を実行するごとに (0から IDのような 配列を組むようにする) 以下のようにするには どのようにすればよいでしょうか? // == print_r == Array (   [0] => Array     (       [a] => A3       [b] => B3       [c] => C3       [d] => D3     )   [1] => Array     (       [a] => A9       [b] => B9       [c] => C9       [d] => D9     ) ) // == /print_r == 使用目的は get_contentsしたものを正規表現で取り出し 配列にする処理に使おうと思っています。

    • ベストアンサー
    • PHP
  • 配列についてです(PHP)

    $a=array(1,2,3); とある場合、この 1,2,3は「要素」と呼ばれるのでしょうか? 「値」とは呼ばれないのでしょうか? $a=array("a"=>1,"b"=>2,"c"=>3); の場合、a,b,c は「添え字」もしくは「キー」になって 1,2,3は「値」となると思いますが、「要素」とは呼ばれないのでしょうか? $a["a"] ←これを「要素」と呼ぶのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Null同士の結合

    お力貸してください。 [Table111] データA   データB    データC     Name111 Null     1        5         あああ 2       Null      6         いいい 3       4        7         ううう [Table222] データA    データB     データC     Name222 Null      1         5          AAA 2        Null       6          BBB 3        4         7          CCC Table111とtable222をデータAとデータBとデーターCの3つで結合して 新しいテーブルをつくりたいです。 [TableC] データA    データB   データC  Name111   Nam222 Null       1       5      あああ       AAA 2         Null     6      いいい       BBB 3         4       7      ううう       CCC Nullもデーターとして認識させたいのですが、うまくいきません。 できれば、新しくテーブルを作ったりしたくないです。 お知恵をかしてください。よろしくおねがいします。

  • 配列から別の配列の要素を削除する方法

    ある配列array_aに、100件の文字列要素が格納されています。 別の配列array_bには、80件の文字列要素が格納されています。 array_aの要素、array_bの要素共に重複するものはありません。 array_b中に存在する要素はすべてarray_a中にも存在します。 array_aにあり、array_bにはない要素で構成されたarray_cの作り方を教えてください。 例えば $array_a=array("a","b","c","d","e","f","g"); $array_b=array("e","b","d"); なら、 $array_c=array("a","c","f","g") になります。 配列array_aとarray_bは、 $array_b=array("b","b","d"); であったり、 $array_a=array("a","a","b","c","d","e","f","g"); といった「重複する要素を含むパターン」はありません。要素はすべてユニークです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう