質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

4回答

2812閲覧

PHPで2次元配列の結合をしたい

hidepon

総合スコア206

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

0クリップ

投稿2017/08/13 01:08

編集2017/08/13 01:45

PHPで
下記のような配列を結合したいのですが、どうもarray_merge では結合が出来ません。
配列A

Array ( [002] => Array ( [str_in] => 1415 [date] => 2017-08-12 ) [008] => Array ( [str_in] => 1415 [date] => 2017-08-12 ) [045] => Array ( [str_in] => 1330 [date] => 2017-08-12 ) )

配列B

Array ( [002] => Array ( [str_out] => 2345 [date] => 2017-08-12 ) [008] => Array ( [str_out] => 2345 [date] => 2017-08-12 ) [045] => Array ( [str_out] => 2345 [date] => 2017-08-12 ) )

を結合して

Array ( [002] => Array ( [str_in] => 1415 [date] => 2017-08-12 [str_out] => 2345 ) [008] => Array ( [str_in] => 1415 [date] => 2017-08-12 [str_out] => 2345 ) [045] => Array ( [str_in] => 1330 [date] => 2017-08-12 [str_out] => 2345 ) )

としたいのですが、

Array ( [002] => Array ( [str_in] => 1415 [date] => Array ( [0] => 2017-08-12 [1] => 2017-08-12 ) [str_out] => 2345 ) [008] => Array ( [str_in] => 1415 [date] => Array ( [0] => 2017-08-12 [1] => 2017-08-12 ) [str_out] => 2345 ) [045] => Array ( [str_in] => 1330 [date] => Array ( [0] => 2017-08-12 [1] => 2017-08-12 ) [str_out] => 2345 ) )

となってしまいます。
array_merge_recursiveを利用したのですが、
上手くいきません。効率良く処理したいのですが、
どのようにして良いのか良く分からず困っています。
宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/13 01:42

ご自身で試したコードを追記してください。キー名が異なるので単純な処理をしているようには見えません。
hidepon

2017/08/13 01:46

ご指摘有難うございます。最後の部分に記述ミスがありました。キー名称はすべて同じです。
guest

回答4

0

ちょっと要件が微妙ですけど、やりたいことから考えるとarray_replace_recursiveですかね。

php

1<?php 2 3$arr_a = [ 4 "002" => [ 5 "str_in" => 1415 6 , "date" => "2017-08-12" 7 ] 8 , "008" => [ 9 "str_in" => 1415 10 , "date" => "2017-08-12" 11 ] 12 , "045" => [ 13 "str_in" => 1330 14 , "date" => "2017-08-12" 15 ] 16]; 17 18$arr_b = [ 19 "002" => [ 20 "str_out" => 2345 21 , "date" => "2017-08-12" 22 ] 23 , "008" => [ 24 "str_out" => 2345 25 , "date" => "2017-08-12" 26 ] 27 , "045" => [ 28 "str_out" => 2345 29 , "date" => "2017-08-12" 30 ] 31]; 32 33$result = array_replace_recursive($arr_a, $arr_b); 34print_r($result);
Array ( [002] => Array ( [str_in] => 1415 [date] => 2017-08-12 [str_out] => 2345 ) [008] => Array ( [str_in] => 1415 [date] => 2017-08-12 [str_out] => 2345 ) [045] => Array ( [str_in] => 1330 [date] => 2017-08-12 [str_out] => 2345 ) )

投稿2017/08/13 01:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/13 01:59

テスト用の配列は Kosuke_Shibuya さんのモノをパクりました! Kosuke_Shibuya さん、失礼^^
退会済みユーザー

退会済みユーザー

2017/08/13 02:07

質問者が提供してくれるといいんですけどね〜 正直、いちいちめんどくさい。
hidepon

2017/08/13 02:20

ご迷惑をおかけし申し訳ないです。ご返答を頂き感謝しています。array_replace_recursiveという関数知らなかったです。Kosuke_Shibuyaさん、本当に申し訳ないです。
退会済みユーザー

退会済みユーザー

2017/08/13 02:23

> Kosuke_Shibuya さん input と output の配列が提供されているだけでもこの質問は回答しやすいかと。 まぁ、配列加工するのが面倒なので、Kosuke_Shibuya さんの回答がなければスルーするつもりだった私が言うのもナンですけど^^; > hidepon さん 要件どおりの挙動か、マニュアルを確認してみてください。 現在の質問では、Tak1016 さんの指摘の通り、特に上書きが必要となるような場合の条件が緩いです。
guest

0

ベストアンサー

php

1<?php 2 3$arr_a = [ 4 "002" => [ 5 "str_in" => 1415 6 , "date" => "2017-08-12" 7 ] 8 , "008" => [ 9 "str_in" => 1415 10 , "date" => "2017-08-12" 11 ] 12 , "045" => [ 13 "str_in" => 1330 14 , "date" => "2017-08-12" 15 ] 16]; 17 18$arr_b = [ 19 "002" => [ 20 "str_out" => 2345 21 , "date" => "2017-08-12" 22 ] 23 , "008" => [ 24 "str_out" => 2345 25 , "date" => "2017-08-12" 26 ] 27 , "045" => [ 28 "str_out" => 2345 29 , "date" => "2017-08-12" 30 ] 31]; 32 33$tmp = []; 34foreach ($arr_a as $k => $v) { 35 $tmp[$k] = $v + $arr_b[$k]; 36} 37 38var_dump($tmp); 39

投稿2017/08/13 01:47

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

array_mergeを使うなら、これでいけるかと思います。ただ、他の方もおっしゃっているように、重複がある場合(この場合'date'になります)、上書きになります。今回は、同じ値ですが、値が異なる場合、どちらを優先するのか考えて、自作するしかないかと思います。

php

1<?php 2 3$array = array( 4 '002' => array(), 5 '008' => array(), 6 '045' => array(), 7); 8 9$arrayA = array( 10 '002' => array( 11 'str_in' => 1415, 12 'date' => '2017-08-12' 13 ), 14 '008' => array( 15 'str_in' => 1415, 16 'date' => '2017-08-12' 17 ), 18 '045' => array( 19 'str_in' => 1330, 20 'date' => '2017-08-12' 21 ), 22); 23 24$arrayB = array( 25 '002' => array( 26 'str_out' => 2345, 27 'date' => '2017-08-12' 28 ), 29 '008' => array( 30 'str_out' => 2345, 31 'date' => '2017-08-12' 32 ), 33 '045' => array( 34 'str_out' => 2345, 35 'date' => '2017-08-12' 36 ), 37); 38 39 40foreach ($array as $key => $value) { 41 $array[$key] = array_merge($arrayA[$key], $arrayB[$key]); 42} 43 44var_dump($array); 45

投稿2017/08/14 08:14

shinnnn

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

効率よくとおっしゃってますが、その配列をあなたの都合よくmergeしてくれる機能は無いと思います。

単純な配列だとしても
A= [1,2,3]
B= [2,3,4]
この場合

  • [[1,2,3],[2,3,4]] 配列を要素として別の配列を作成
  • [1,2,3,4] 和集合(重複を除去)
  • [1,2,2,3,3,4] 単なる要素の足し算

とか考えられます。

ご提示の配列の場合、連想配列の配列という複雑な配列を結合しようとしています。
まず、配列の[002]というインデクスが重複していたらどうするのですか?
[002]の下の連想配列のkeyが重複していた場合、Aを優先するのですかBを優先するのですか?

どのようにデータを結合したいのかを知っているのはあなたしかいないので、自身で仕様通りに関数を実装されるのが一番「効率よく」なると思います。

投稿2017/08/13 01:55

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問