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

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

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

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

Q&A

解決済

3回答

822閲覧

PHP 配列 再構築

Fetherion

総合スコア60

PHP

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

0グッド

0クリップ

投稿2019/05/07 03:00

編集2019/05/08 01:19

###デモデータ1

PHP

1$demo_A['1111'] = [ 2 ['id' => 1111, 'body' => 'text1'], 3 ['id' => 1111, 'body' => 'text2'], 4 ['id' => 1111, 'body' => 'text3'], 5]; 6$demo_A['2222'] = [ 7 ['id' => 2222, 'body' => 'text1'], 8 ['id' => 2222, 'body' => 'text2'], 9 ['id' => 2222, 'body' => 'text3'], 10];

まず一つ目の配列として、上記のようなデータを用意しているとします。
次に、別の配列データとして下記のようなデータがあったとします。

PHP

1$demo_B['demoData'] = [ 2 ['id' => 2222, 'body' => 'text_A1'], 3];

###やりたいこと
やりたいこととしては、上記の$demo_Aの配列と$demo_Bの配列の結合ではあります。

###最終的になってほしい配列

PHP

1$marge_demo['1111'] = [ 2 ['id' => 1111, 'body' => 'text1'], 3 ['id' => 1111, 'body' => 'text2'], 4 ['id' => 1111, 'body' => 'text3'], 5]; 6$marge_demo['1111']['demoData'] = [ 7 ['id' => 1111, 'body' => ''], 8]; 9 10$marge_demo['2222'] = [ 11 ['id' => 2222, 'body' => 'text1'], 12 ['id' => 2222, 'body' => 'text2'], 13 ['id' => 2222, 'body' => 'text3'], 14]; 15$marge_demo['2222']['demoData'] = [ 16 ['id' => 2222, 'body' => 'text_A1'], 17];

var_dumpした結果も載せておきます

PHP

1array(2) { 2 [1111]=> 3 array(4) { 4 [0]=> 5 array(2) { 6 ["id"]=> 7 int(1111) 8 ["body"]=> 9 string(5) "text1" 10 } 11 [1]=> 12 array(2) { 13 ["id"]=> 14 int(1111) 15 ["body"]=> 16 string(5) "text2" 17 } 18 [2]=> 19 array(2) { 20 ["id"]=> 21 int(1111) 22 ["body"]=> 23 string(5) "text3" 24 } 25 ["demoData"]=> 26 array(1) { 27 [0]=> 28 array(2) { 29 ["id"]=> 30 int(1111) 31 ["body"]=> 32 string(0) "" 33 } 34 } 35 } 36 [2222]=> 37 array(4) { 38 [0]=> 39 array(2) { 40 ["id"]=> 41 int(2222) 42 ["body"]=> 43 string(5) "text1" 44 } 45 [1]=> 46 array(2) { 47 ["id"]=> 48 int(2222) 49 ["body"]=> 50 string(5) "text2" 51 } 52 [2]=> 53 array(2) { 54 ["id"]=> 55 int(2222) 56 ["body"]=> 57 string(5) "text3" 58 } 59 ["demoData"]=> 60 array(1) { 61 [0]=> 62 array(2) { 63 ["id"]=> 64 int(2222) 65 ["body"]=> 66 string(7) "text_A1" 67 } 68 } 69 } 70}

###やってみたこと

PHP

1foreach($demo_B as $B) { 2 $key_id = $B['id']; 3 $marge_demo[$key_id]['demoData'] = $B; 4}

###最後に
今回のデモデータにおいては、demo_Aの二つの情報に対して一つしか無い状況ではありましたが、当然両方に対するデータがある場合もあります。
そして、demo_B自体が無い場合もあります。

データが有る無しに関わらず、上記のような配列を作成することができればと思っています。

あくまでも$marge_demoという配列の中で、idごとに配列が作られているという状況が望ましいです。

わかりづらい部分もありますが、よろしくお願いいたします。

###追記1
すみません。確認ミスですが、少しデモデータの方ミスがありました。
それと、今自分がやってることのコードも書きました。

###解決策
ずっと見てたのであれでしたが、、、
一旦demo_Aの配列とはある意味別にdemo_Bのデータを上記やってみたことによって、くっつけたようにできているので、その次に$marge_demoを回しながら['demoData']が存在するかをチェックして、存在していればそのままにし、存在していなければまぁその分の配列を追加すれば良いなという事に気づきました。

ご指摘や回答大変参考になりました。
お手数をおかけしましたが、一旦これでやっていってみようと思っていますので、こちらの質問を一度解決とさせていただきます。

ありがとうございました。

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

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

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

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

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

namda

2019/05/07 03:08

正解プログラムを求めるだけの丸投げ質問はNGです。 試行錯誤してるプログラムを載せ、何がどう上手く行かないのか説明してください。
Fetherion

2019/05/08 01:24

ご指摘ありがとうございました。
guest

回答3

0

自己解決

$demo_Bの配列にデータがあれば、そのデータを元にしつつ、idで分けれるように再構築をとりあえずします。
※質問のやってみたの部分

そうすると、$demo_A['2222']の配列に$demo_Bが入ってきて、$demo_A['1111']には$demo_Bが無いという状況なだけなので、$demo_Aを回して、$demo_Bの部分があるかないかを配列チェックして、無ければそのようなデータを追加、あればそのままスルーということだけだったな、、、と気づきました。

少し、複雑に考えすぎていました。

手間としてはもう少しスッキリする方法もあるかとは思いますが、とりあえずこの流れでやっていってみようと思います。

投稿2019/05/08 01:22

Fetherion

総合スコア60

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

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

0

与えられるデータが変な気がしますが、書いてあるとおりならこういうことですかねぇ

php

1<?php 2$demo_A=[ 3 '1111'=>[ 4 ['id'=>1111, 'body'=>'text1'], 5 ['id'=>1111, 'body'=>'text2'], 6 ['id'=>1111, 'body'=>'text3'], 7 ] 8]; 9$demo_B=['2222'=>[ 10 ['id'=>2222, 'body'=>'text1'], 11 ['id'=>2222, 'body'=>'text2'], 12 ['id'=>2222, 'body'=>'text3'], 13 ], 14 'demoData'=>[ 15 ['id'=>2222, 'body'=>'text_A1'], 16 ], 17]; 18 19function demobuilder(array $arr) : array { 20 $body = isset($arr['demoData']) ? $arr['demoData'][0]['body'] : ''; 21 unset($arr['demoData']); 22 $key = array_keys($arr)[0]; 23 $arr[$key]['demoData'] = [['id' => intval($key), 'body' => $body]]; 24 return $arr; 25} 26 27var_dump(demobuilder($demo_A)+demobuilder($demo_B));

投稿2019/05/07 14:54

papinianus

総合スコア12705

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

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

Fetherion

2019/05/08 01:25

すみません、、、デモデータの所が確かに変でした。
guest

0

こういうことですかね?

PHP

1$a=[ 2 '1111'=>[ 3 ['id'=>1111, 'body'=>'text1'], 4 ['id'=>1111, 'body'=>'text2'], 5 ['id'=>1111, 'body'=>'text3'], 6 ], 7 '2222'=>[ 8 ['id'=>2222, 'body'=>'text1'], 9 ['id'=>2222, 'body'=>'text2'], 10 ['id'=>2222, 'body'=>'text3'], 11 ], 12]; 13 14$b=[ 15 'demoData'=>[ 16 ['id'=>2222, 'body'=>'text_A1'], 17 ], 18 ]; 19 20$c=array_combine(array_keys($a),array_map(function($key,$val) use($b){ 21 if($key==$b['demoData'][0]['id']){ 22 $val['demoData'][0]=$b['demoData'][0]; 23 }else{ 24 $val['demoData'][0]=['id'=>$key, 'body'=>'']; 25 } 26 return $val; 27},array_keys($a),$a)); 28print_r($c);

投稿2019/05/07 03:28

yambejp

総合スコア114843

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

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

Fetherion

2019/05/08 01:26

ありがとうございます。 デモデータなど変な所もありましたが、こういうやり方が全然理解できていないので、とても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問