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

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

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

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

Q&A

解決済

3回答

3106閲覧

php 同じidを持つもの同士でデータをマージしたい

amaguri

総合スコア227

PHP

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

0グッド

0クリップ

投稿2017/09/01 01:36

やりたいこと
複数の配列同士をid同士でマージしたい

array(2) { ["category"]=> array(2) { [22122]=> string(1) "e" [22123]=> string(1) "m" } ["body"]=> array(2) { [22122]=> string(0) "hogehoge" [22123]=> string(0) "ninnin" } }

この配列を

array(2) { ["merge"]["1"]=>array(3){[id]=> '22122' [body]=> 'hogehoge' [category]=> 'e'} ["merge"]["2"]=>array(3){[id]=> '22123' [body]=> 'ninnin' [category]=> 'm'} }

のように
同じidを持つもの同士でマージするにはどうすれば良いでしょうか?

二つによると

$hoge = array(); $i = 1; while(isset($post["category"][$i]) && isset($post["body"][$i])){ $hoge[$i] = [ 'img'=>, 'body'=>$post["body"][$i], 'category'=>$post["category"][$i], ]; $i++; }

とやってみたのですが
idがうまく設定できずに
どうすればできますでしょうか?

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

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

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

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

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

kei344

2017/09/01 17:44

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。また、解決されていないなら状況を質問文に追記ください。
guest

回答3

0

ベストアンサー

PHPはものによりますが、while()よりもforeach()のほうがパフォーマンスが高いことが多いです。

php

1$category = array( 2 22122 => 'e', 3 22123 => 'm', 4 22124 => 'm', 5); 6 7$body = array( 8 22122 => 'hogehoge', 9 22123 => 'ninnin', 10 22125 => 'fugafuga', 11); 12 13$hoge = array(); 14 15 16foreach ($body as $key => $value) { 17 // カテゴリが存在しなかったらスキップ 18 if (! isset($category[$key])) { 19 continue; 20 } 21 22 $hoge[] = array( 23 'id' => $key, 24 'body' => $value, 25 'category' => $category[$key], 26 ); 27} 28 29echo "<pre>\n"; 30echo "CATEGORY : "; 31print_r($category); 32echo "\n"; 33 34echo "BODY : "; 35print_r($body); 36echo "\n"; 37 38echo "COMBINED : "; 39print_r($hoge); 40echo "</pre>\n";

array_walk()を使っても同じことができます。
好みの問題もあると思いますが、パフォーマンスとメンテナンス性を考えて決めるといいと思います。

php

1$category = array( 2 22122 => 'e', 3 22123 => 'm', 4 22124 => 'm', 5); 6 7$body = array( 8 22122 => 'hogehoge', 9 22123 => 'ninnin', 10 22125 => 'fugafuga', 11); 12 13$hoge = array(); 14 15 16array_walk($body, function ($value, $key, $array) 17{ 18 $category = $array[0]; 19 20 // カテゴリが存在しなかったらスキップ 21 if (! isset($category[$key])) { 22 return false; 23 } 24 25 // Array $hoge を上書き(PHPの「参照」を使用) 26 $array[1][] = array( 27 'id' => $key, 28 'body' => $value, 29 'category' => $category[$key], 30 ); 31}, array($category, &$hoge)); 32 33echo "<pre>\n"; 34echo "CATEGORY : "; 35print_r($category); 36echo "\n"; 37 38echo "BODY : "; 39print_r($body); 40echo "\n"; 41 42echo "COMBINED : "; 43print_r($hoge); 44echo "</pre>\n";

投稿2017/09/01 03:46

Tomak

総合スコア1652

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

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

amaguri

2017/09/01 05:10

なるほど!ありがとうございます!
退会済みユーザー

退会済みユーザー

2017/09/01 05:58

記述してあることを愚直に表現という意味では、こちらのほうが正しいですね^^;ちょっと恥ずかしいw
guest

0

せっかくなんで、妄想版も上げておきます。
妄想と言いつつも、こっちで満たせる気がしますw

php

1<?php 2$category = [ 3 22122 => "e", 4 22123 => "m", 5 22124 => "m", 6 ]; 7$body =[ 8 22122 => "hogehoge", 9 22123 => "ninnin", 10 22125 => "fugafuga", 11 ]; 12foreach ($category as $key => $val) { 13 $result['merge'][] = [ 14 'id' => $key, 15 'category' => $category[$key], 16 'body' => isset($body[$key])?$body[$key]:'', 17 ]; 18} 19var_dump($result);

php

1array(1) { 2 ["merge"]=> 3 array(3) { 4 [0]=> 5 array(3) { 6 ["id"]=> 7 int(22122) 8 ["category"]=> 9 string(1) "e" 10 ["body"]=> 11 string(8) "hogehoge" 12 } 13 [1]=> 14 array(3) { 15 ["id"]=> 16 int(22123) 17 ["category"]=> 18 string(1) "m" 19 ["body"]=> 20 string(6) "ninnin" 21 } 22 [2]=> 23 array(3) { 24 ["id"]=> 25 int(22124) 26 ["category"]=> 27 string(1) "m" 28 ["body"]=> 29 string(0) "" 30 } 31 } 32}

投稿2017/09/01 02:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

amaguri

2017/09/01 05:10

なるほど!ありがとうございます! これでバッチリでした!!
guest

0

色々と条件を確認することで、きれいなスクリプトがかけそうですが、とりあえず記述してあることを愚直に表現してみました。

php

1<?php 2$category = [ 3 22122 => "e", 4 22123 => "m", 5 22124 => "m", 6 ]; 7$body =[ 8 22122 => "hogehoge", 9 22123 => "ninnin", 10 22125 => "fugafuga", 11 ]; 12$arr_key = array_unique(array_merge(array_keys($category),array_keys($body))); 13sort($arr_key); 14$i = 0; 15foreach ($arr_key as $key) { 16 $result['merge'][++$i] = [ 17 'id' => $key, 18 'category' => isset($category[$key])?$category[$key]:'', 19 'body' => isset($body[$key])?$body[$key]:'', 20 ]; 21} 22var_dump($result);

php

1array(1) { 2 ["merge"]=> 3 array(4) { 4 [1]=> 5 array(3) { 6 ["id"]=> 7 int(22122) 8 ["category"]=> 9 string(1) "e" 10 ["body"]=> 11 string(8) "hogehoge" 12 } 13 [2]=> 14 array(3) { 15 ["id"]=> 16 int(22123) 17 ["category"]=> 18 string(1) "m" 19 ["body"]=> 20 string(6) "ninnin" 21 } 22 [3]=> 23 array(3) { 24 ["id"]=> 25 int(22124) 26 ["category"]=> 27 string(1) "m" 28 ["body"]=> 29 string(0) "" 30 } 31 [4]=> 32 array(3) { 33 ["id"]=> 34 int(22125) 35 ["category"]=> 36 string(0) "" 37 ["body"]=> 38 string(8) "fugafuga" 39 } 40 } 41}

投稿2017/09/01 02:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問