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

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

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

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

Q&A

解決済

3回答

552閲覧

phpで配列を連結すると、消えてしまう

anpanmama

総合スコア8

PHP

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

0グッド

0クリップ

投稿2020/01/21 11:26

PHPの配列連結についての質問になります。

'name'の値が同じとき'post_arr'を連結し、違うときは外側に連結したいです。

###具体例
まず下記(例1)は同じ'name'なので、'post_arr'を連結して$resultとしたいです。

(例1)

php

1$new_wrapper = [ 2 [ 3 'name' => 'nameA', 4 'post_arr' => [ ['id'=>3,'type'=>'c'] ], 5 ], 6]; 7 8$leave_wrapper = [ 9 [ 10 'name' => 'nameA', 11 'post_arr' => [ ['id'=>1,'type'=>'a'] ], 12 ], 13]; 14 15$result = [ 16 [ 17 'name' => 'nameA', 18 'post_arr' => [ ['id'=>1,'type'=>'a'], ['id'=>3,'type'=>'c'] ], 19 ], 20];

そして下記(例2)は違う'name'なので、外側に連結して$resultとしたいです。

(例2)

php

1$new_wrapper = [ 2 [ 3 'name' => 'nameC', 4 'post_arr' => [ ['id'=>3,'type'=>'c'] ], 5 ], 6]; 7 8$leave_wrapper = [ 9 [ 10 'name' => 'nameA', 11 'post_arr' => [ ['id'=>1,'type'=>'a'] ], 12 ], 13]; 14 15$result = [ 16 [ 17 'name' => 'nameA', 18 'post_arr' => [ ['id'=>1,'type'=>'a'] ], 19 ], 20 [ 21 'name' => 'nameC', 22 'post_arr' => [ ['id'=>3,'type'=>'c'] ], 23 ], 24];

###ソースコード
上のような連結を実現したいと思っていて、それが下記コードのmy_marge()という関数ですが、何も取得できなくなってしまいました。

foreachでのループのあたりが怪しいと思うのですが…、どうすれば上のような連結ができるようになりますでしょうか。

php

1<?php 2// 新しく追加する配列 3$new_wrapper = [ 4 [ 5 'name' => 'nameC', 6 'post_arr' => [ ['id'=>3,'type'=>'c'] ], 7 ], 8 [ 9 'name' => 'nameD', 10 'post_arr' => [ ['id'=>4,'type'=>'d'] ], 11 ], 12]; 13 14// 最終的な配列 15$result = my_marge( $new_wrapper ); 16var_dump( $result ); 17 18// 最終的な配列を取得 19function my_marge( $new_wrapper ){ 20 $result = []; 21 22 // 現在の配列 23 $leave_wrapper = [ 24 [ 25 'name' => 'nameA', 26 'post_arr' => [ ['id'=>1,'type'=>'a'] ], 27 ], 28 [ 29 'name' => 'nameB', 30 'post_arr' => [ ['id'=>2,'type'=>'b'] ], 31 ], 32 ]; 33 34 foreach( $leave_wrapper as $leave ){ 35 $leave_name = $leave['name']; 36 $leave_post_arr = $leave['post_arr']; 37 38 foreach( $new_wrapper as $new ){ 39 $new_name = $new['name']; 40 $new_post_arr = $new['post_arr']; 41 42 // nameが同じならpost_arrを連結 43 if( $new_name == $leave_name ){ 44 foreach( $new_post_arr as $new_post ){ 45 $leave['post_arr'][] = $new_post; 46 } 47 } 48 49 // nameが違うなら外側に連結 50 else{ 51 array_merge( $leave_wrapper, $new_wrapper ); 52 exit(); 53 } 54 } 55 } 56 57 return $leave_wrapper; 58} 59

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/21 11:43

例が乏しすぎてよくわからない。$new_wrapperや$leave_wrapperの中に、'name'と'post_arr'の組が複数個存在するケースが有るなら、そこにも言及してほしい。
anpanmama

2020/01/21 11:52

はい、ソースコードにあるように、'name'と'post_arr'の組は複数存在します。
m.ts10806

2020/01/21 11:53

>phpで 細かいのですが、名称などの英数は全角を使われない方が良いです。 なるべく公式通りに書きましょう。プログラムは書いた通りにしか動かないので、 こういうところを注意できないと凡ミスで時間を浪費することになります。
guest

回答3

0

おそらくですが、途中でexitしているので、何も取得できないのではないでしょうか?

投稿2020/01/21 12:48

noka_blank

総合スコア252

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

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

papinianus

2020/01/21 17:00

exit したら取得できなくないですか?なんでこの回答がマイナスなの。
anpanmama

2020/01/21 21:47

nameが違うときはforeachから抜けたいのでecitとしたのですが、そうですよね。ありがとうございます。
guest

0

ベストアンサー

頭が痛くなってきた。
こういう構造にできないものかねぇ。

php

1$new_wrapper = [ 2 'nameA' => [ 3 'name' => 'nameA', 4 'post_arr' => [ 5 3 => ['id'=>3,'type'=>'c'] 6 ], 7 ], 8];

とか、いっそ

php

1$new_wrapper = [ 2 'nameA' => [ 3 'post_arr' => [ 4 3 => ['type'=>'c'] 5 ], 6 ], 7];

とか。

ユニークキーがつかない、配列の入れ子って、ユニークさを扱うのがちょー面倒なんですけど。

ほんの、手慰み。

php

1<?php 2 3 4$new_wrapper = [ 5 'nameA' => [ 6 'name' => 'nameA', 7 'post_arr' => [ 8 3 => ['id'=>3,'type'=>'c'] 9 ], 10 ], 11]; 12 13$leave_wrapper = [ 14 'nameA' => [ 15 'name' => 'nameA', 16 'post_arr' => [ 17 1 => ['id'=>1,'type'=>'a'] 18 ], 19 ], 20]; 21 22/* 23$new_wrapper = [ 24 'nameC' => [ 25 'name' => 'nameC', 26 'post_arr' => [ 27 3 => ['id'=>3,'type'=>'c'] 28 ], 29 ], 30]; 31 32$leave_wrapper = [ 33 'nameA' => [ 34 'name' => 'nameA', 35 'post_arr' => [ 36 1 => ['id'=>1,'type'=>'a'] 37 ], 38 ], 39]; 40*/ 41 42$result = $new_wrapper; 43foreach ($leave_wrapper as $key => $arr) { 44 if (isset($result[$key])) { 45 foreach ($arr['post_arr'] as $k => $v) { 46 $result[$key]['post_arr'][$k] = $v; 47 } 48 } 49 else { 50 $result[$key] = $arr; 51 } 52} 53var_export($result);

ついでに、質問文中にあった構造をちゃんと入力としておきたい場合は、
こういう関数を書いておくと私のサンプルコードのような形式になるよ、と。

php

1function apply_unique_key($arr) { 2 $result = []; 3 foreach ($arr as $item) { 4 if (isset($item['name'])) { 5 $result2 = []; 6 foreach ($item['post_arr'] as $item2) { 7 if (isset($item2['id'])) { 8 $result2[$item2['id']] = $item2; 9 } 10 } 11 $result[$item['name']] = [ 12 'name' => $item['name'], 13 'post_arr' => $result2 14 ]; 15 16 } 17 } 18 return $result; 19}

投稿2020/01/21 11:57

編集2020/01/21 12:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

anpanmama

2020/01/21 21:46

関数化までどうもありがとうございます。助かりました!構造もよく考えておきたいと思います。
anpanmama

2020/01/21 23:03 編集

後学のためにお伺いしたいのですが、連番キーでなくユニークキーを(つけられるなら)つけるべきという考えでいた方がよろしいでしょうか? 3 => ['id'=>3,'type'=>'c'] とか 'nameA' => [ 'name' => 'nameA', ], とかですと、重複した情報がある点をどうかと思っていたのですが、今回のケースでその重複より得られるメリットが大きいなら、ユニークキーをつけるべきかも知れないなと思いました。
退会済みユーザー

退会済みユーザー

2020/01/22 00:44

PHPマニュアルの配列: https://www.php.net/manual/ja/language.types.array.php 他適切な情報に触れていただきたいです。 keyとvalueのペアの方が、いちいちvalueの中身をチェックしてから採否判定しなくてもkeyの存在確認だけで済むので楽っていう話です。 それも理由として、他の言語で言ういわゆる連想配列(keyとvalueを組み合わせた配列データの持ち方)が実装されているわけで。
anpanmama

2020/01/22 01:23

なるほどです。度重なるアドバイスに感謝申し上げます。
guest

0

コレと同じですかね?

PHPによる配列の変換で、ループの処理がうまくいかないです

個人的には、元のデータの持ち方を再検討したほうが良いと思います。

投稿2020/01/21 11:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

anpanmama

2020/01/21 11:51

はい、元はソレを考えていて、かなり簡易なかたちで再挑戦したのが今回の質問になっています。元のデータの持ち方を再検討とは?
退会済みユーザー

退会済みユーザー

2020/01/21 11:58

コードを試しに書いてみて、データの持ち方がおかしいという点に気づいたことは、同じ意見かも。
退会済みユーザー

退会済みユーザー

2020/01/21 14:54

> 元のデータの持ち方を再検討とは? リンク先で提案しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問