🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

2回答

1166閲覧

多次元配列のまとめ方

kinisinai

総合スコア28

PHP

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

0グッド

0クリップ

投稿2019/11/27 02:21

編集2019/11/27 02:22

下記のような配列があります。

PHP

1 2$testarr[] = array( 3 'namae' => '田中', 4 'address' => 'hogestreet1', 5 'favorite' => 'マグロ', 6 'price' => '100', 7 'eart_date' => '2019-11-11' 8 ); 9 $testarr[] = array( 10 'namae' => '田中', 11 'address' => 'hogestreet1', 12 'favorite' => 'ハマチ', 13 'price' => '120', 14 'eart_date' => '2019-11-12' 15 ); 16 $testarr[] = array( 17 'namae' => '田中', 18 'address' => 'hogestreet1', 19 'favorite' => 'いくら', 20 'price' => '180', 21 'eart_date' => '2019-11-11' 22 ); 23 $testarr[] = array( 24 'namae' => '田中', 25 'address' => 'hogestreet1', 26 'favorite' => 'サーモン', 27 'price' => '140', 28 'eart_date' => '2019-11-13' 29 ); 30 $testarr[] = array( 31 'namae' => '田中', 32 'address' => 'hogestreet1', 33 'favorite' => 'イワシ', 34 'price' => '100', 35 'eart_date' => '2019-11-15' 36 ); 37 $testarr[] = array( 38 'namae' => '松田', 39 'address' => 'hogestreet2', 40 'favorite' => 'ししゃも', 41 'price' => '120', 42 'eart_date' => '2019-12-11' 43 ); 44 $testarr[] = array( 45 'namae' => '松田', 46 'address' => 'hogestreet2', 47 'favorite' => 'サバ', 48 'price' => '110', 49 'eart_date' => '2019-12-12' 50 ); 51 $testarr[] = array( 52 'namae' => '松田', 53 'address' => 'hogestreet2', 54 'favorite' => 'タイ', 55 'price' => '200', 56 'eart_date' => '2019-12-11' 57 ); 58 $testarr[] = array( 59 'namae' => '松田', 60 'address' => 'hogestreet2', 61 'favorite' => 'ぶり', 62 'price' => '140', 63 'eart_date' => '2019-12-13' 64 ); 65 $testarr[] = array( 66 'namae' => '松田', 67 'address' => 'hogestreet2', 68 'favorite' => 'カレイ', 69 'price' => '100', 70 'eart_date' => '2019-12-15' 71 ); 72

これらの配列を名前をキーとして重複しているものをまとめて配列にしたいと考えています。

イメージとしては

PHP

1 2$kanseilist = array ( 3 0 => 4 array ( 5 'userinfo' => array( 6 0 => '田中', 7 1 => 'hogestreet1' 8 ), 9 'favoritelist' => array ( 10 0 => array( 11 0 => 'マグロ', 12 1 => '100', 13 2 => '2019-11-11' 14 ), 15 1 => array( 16 0 => 'ハマチ', 17 1 => '120', 18 2 => '2019-11-12' 19 ), 20 2 => array( 21 0 => 'いくら', 22 1 => '180', 23 2 => '2019-11-11' 24 ), 25 3 => array( 26 0 => 'サーモン', 27 1 => '140', 28 2 => '2019-11-13' 29 ), 30 4 => array( 31 0 => 'イワシ', 32 1 => '100', 33 2 => '2019-11-15' 34 ), 35 ), 36 1 => 37 array ( 38 'userinfo' => array( 39 0 => '松田', 40 1 => 'hogestreet2' 41 ), 42 'favoritelist' => array ( 43 0 => array( 44 0 => 'ししゃも', 45 1 => '120', 46 2 => '2019-12-11' 47 ), 48 1 => array( 49 0 => 'サバ', 50 1 => '110', 51 2 => '2019-12-12' 52 ), 53 2 => array( 54 0 => 'タイ', 55 1 => '200', 56 2 => '2019-12-11' 57 ), 58 3 => array( 59 0 => 'ぶり', 60 1 => '140', 61 2 => '2019-12-13' 62 ), 63 4 => array( 64 0 => 'カレイ', 65 1 => '100', 66 2 => '2019-12-15' 67 ), 68 ), 69 );

このような配列を作成したいと考えております。

試したこととしては

PHP

1 2$temp = []; 3$arr = []; 4 5 6 foreach ($testarr as $value) { 7 $temp[$value['namae']][] = $value['favorite']; 8 $temp[$value['address']][] = $value['favorite']; 9 } 10 11 foreach ($temp as $name => $favorites) { 12 $arr[] = [ 13 'name' => $name, 14 $favorites 15 ]; 16 }

このようなことを試しましたがうまくいかず詰まっております。
何かご教授いただけないでしょうか?
よろしくお願いします。

追記
ケータイからの投稿によりインデントがぐちゃぐちゃになっているかもしれませんが申し訳ありません。

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

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

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

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

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

m.ts10806

2019/11/27 02:46

同じタイトルで質問繰り返されていますが、過去の質問についた回答は理解できてないということでしょうか。 同一人物で同一タイトルが繰り返されるのは問題が解決していないのとイコールと捉えられます。 現に「丸投げ」と指摘がついているようですね。 それに携帯から投稿ということは手入力したということになります。 それではご自身が組まれているコードとイコールにはならないので、起きている問題の再現確認もできません。 「作れ」と作業依頼しているのと同じですよ。 本当に解決したいのでしたらきちんとコードをコピペしてください。 そういう環境にいないのでしたら、そういう環境に身をおけるようになってから質問してください。 回答ついたとて、携帯からでは読みにくいし動作確認は難しいでしょう?
guest

回答2

0

複雑度が高すぎるのでクラスを作るのが今後の弾力性も考えて妥当かと思います。

回答となる処理はわずか 3 行です。ユニークの名前を得るために面倒なことをしていますが、基本的に、名前の配列を userinfo の配列に map し、それぞれに $testarr をたべさせて、配列形式に map して戻す、の 3 ステップです。
array_map や array_walk は php のばあい foreach でいいと思います。

php

1<?php 2$testarr[] = array( 3 'namae' => '田中', 4 'address' => 'hogestreet1', 5 'favorite' => 'マグロ', 6 'price' => '100', 7 'eart_date' => '2019-11-11' 8); 9$testarr[] = array( 10 'namae' => '田中', 11 'address' => 'hogestreet1', 12 'favorite' => 'ハマチ', 13 'price' => '120', 14 'eart_date' => '2019-11-12' 15); 16$testarr[] = array( 17 'namae' => '田中', 18 'address' => 'hogestreet1', 19 'favorite' => 'いくら', 20 'price' => '180', 21 'eart_date' => '2019-11-11' 22); 23$testarr[] = array( 24 'namae' => '田中', 25 'address' => 'hogestreet1', 26 'favorite' => 'サーモン', 27 'price' => '140', 28 'eart_date' => '2019-11-13' 29); 30$testarr[] = array( 31 'namae' => '田中', 32 'address' => 'hogestreet1', 33 'favorite' => 'イワシ', 34 'price' => '100', 35 'eart_date' => '2019-11-15' 36); 37$testarr[] = array( 38 'namae' => '松田', 39 'address' => 'hogestreet2', 40 'favorite' => 'ししゃも', 41 'price' => '120', 42 'eart_date' => '2019-12-11' 43); 44$testarr[] = array( 45 'namae' => '松田', 46 'address' => 'hogestreet2', 47 'favorite' => 'サバ', 48 'price' => '110', 49 'eart_date' => '2019-12-12' 50); 51$testarr[] = array( 52 'namae' => '松田', 53 'address' => 'hogestreet2', 54 'favorite' => 'タイ', 55 'price' => '200', 56 'eart_date' => '2019-12-11' 57); 58$testarr[] = array( 59 'namae' => '松田', 60 'address' => 'hogestreet2', 61 'favorite' => 'ぶり', 62 'price' => '140', 63 'eart_date' => '2019-12-13' 64); 65$testarr[] = array( 66 'namae' => '松田', 67 'address' => 'hogestreet2', 68 'favorite' => 'カレイ', 69 'price' => '100', 70 'eart_date' => '2019-12-15' 71); 72$users = array_map(function($n) { return new Userinfo($n);}, array_values(array_unique(array_column($testarr, 'namae')))); 73array_walk($users, function($u)use($testarr) { return $u->pickupOwnFavs($testarr);}); 74var_export(array_map(function($u) { return $u->toArray();}, $users)); 75 76class Userinfo { 77 private $name = ''; 78 private $address = ''; 79 private $favs = []; 80 public function __construct($name) { 81 $this->name = $name; 82 } 83 public function pickupOwnFavs($items) { 84 foreach ($items as $item) { 85 if($item['namae'] !== $this->name) continue; 86 $this->address = $item['address']; 87 $this->favs[] = new Favorite($item['favorite'], $item['price'], $item['eart_date']); 88 } 89 } 90 public function toArray() { 91 return ['userinfo' => [$this->name, $this->address], 'favoritelist' => array_map(function ($f) { return $f->toArray();}, $this->favs)]; 92 } 93} 94class Favorite { 95 private $name = ''; 96 private $price = ''; 97 private $eart_date = ''; 98 public function __construct($name, $price, $eart_date) 99 { 100 $this->name = $name; 101 $this->price = $price; 102 $this->eart_date = $eart_date; 103 } 104 public function toArray() { 105 return [$this->name, $this->price, $this->eart_date]; 106 } 107}

出力したサンプル

php

1 2Beta 3paiza.IO Online PHP Editor 4 5 New code 6 Recent code 7 WebDev 8 New! 9 10 English 11 12 13 14 Main.php 15 16Success 17 18 Output 19 Input 20 Comments 0 21 (0.03 sec) 22 23array ( 24 0 => 25 array ( 26 'userinfo' => 27 array ( 28 0 => '田中', 29 1 => 'hogestreet1', 30 ), 31 'favoritelist' => 32 array ( 33 0 => 34 array ( 35 0 => 'マグロ', 36 1 => '100', 37 2 => '2019-11-11', 38 ), 39 1 => 40 array ( 41 0 => 'ハマチ', 42 1 => '120', 43 2 => '2019-11-12', 44 ), 45 2 => 46 array ( 47 0 => 'いくら', 48 1 => '180', 49 2 => '2019-11-11', 50 ), 51 3 => 52 array ( 53 0 => 'サーモン', 54 1 => '140', 55 2 => '2019-11-13', 56 ), 57 4 => 58 array ( 59 0 => 'イワシ', 60 1 => '100', 61 2 => '2019-11-15', 62 ), 63 ), 64 ), 65 1 => 66 array ( 67 'userinfo' => 68 array ( 69 0 => '松田', 70 1 => 'hogestreet2', 71 ), 72 'favoritelist' => 73 array ( 74 0 => 75 array ( 76 0 => 'ししゃも', 77 1 => '120', 78 2 => '2019-12-11', 79 ), 80 1 => 81 array ( 82 0 => 'サバ', 83 1 => '110', 84 2 => '2019-12-12', 85 ), 86 2 => 87 array ( 88 0 => 'タイ', 89 1 => '200', 90 2 => '2019-12-11', 91 ), 92 3 => 93 array ( 94 0 => 'ぶり', 95 1 => '140', 96 2 => '2019-12-13', 97 ), 98 4 => 99 array ( 100 0 => 'カレイ', 101 1 => '100', 102 2 => '2019-12-15', 103 ), 104 ), 105 ), 106) 107

投稿2020/01/15 14:17

papinianus

総合スコア12705

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

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

0

こんな感じで(命題とキー名が違いますが、こっちのほうがわかりやすくないですか?)

  • まずuserinfoのリストをつくり
  • 次にfavoritelistを流し込む

PHP

1$a= [ 2 [ 3 'namae' => '田中', 4 'address' => 'hogestreet1', 5 'favorite' => 'マグロ', 6 'price' => '100', 7 'eart_date' => '2019-11-11' 8 ], 9 [ 10 'namae' => '田中', 11 'address' => 'hogestreet1', 12 'favorite' => 'ハマチ', 13 'price' => '120', 14 'eart_date' => '2019-11-12' 15 ], 16 [ 17 'namae' => '田中', 18 'address' => 'hogestreet1', 19 'favorite' => 'いくら', 20 'price' => '180', 21 'eart_date' => '2019-11-11' 22 ], 23 [ 24 'namae' => '田中', 25 'address' => 'hogestreet1', 26 'favorite' => 'サーモン', 27 'price' => '140', 28 'eart_date' => '2019-11-13' 29 ], 30 [ 31 'namae' => '田中', 32 'address' => 'hogestreet1', 33 'favorite' => 'イワシ', 34 'price' => '100', 35 'eart_date' => '2019-11-15' 36 ], 37 [ 38 'namae' => '松田', 39 'address' => 'hogestreet2', 40 'favorite' => 'ししゃも', 41 'price' => '120', 42 'eart_date' => '2019-12-11' 43 ], 44 [ 45 'namae' => '松田', 46 'address' => 'hogestreet2', 47 'favorite' => 'サバ', 48 'price' => '110', 49 'eart_date' => '2019-12-12' 50 ], 51 [ 52 'namae' => '松田', 53 'address' => 'hogestreet2', 54 'favorite' => 'タイ', 55 'price' => '200', 56 'eart_date' => '2019-12-11' 57 ], 58 [ 59 'namae' => '松田', 60 'address' => 'hogestreet2', 61 'favorite' => 'ぶり', 62 'price' => '140', 63 'eart_date' => '2019-12-13' 64 ], 65 [ 66 'namae' => '松田', 67 'address' => 'hogestreet2', 68 'favorite' => 'カレイ', 69 'price' => '100', 70 'eart_date' => '2019-12-15' 71 ], 72 ]; 73 74$b=array_map(function($x){ 75 return ['userinfo'=>json_decode($x,JSON_OBJECT_AS_ARRAY)]; 76},array_values(array_unique(array_map(function($x){ 77 return json_encode([ 78 'namae'=>$x['namae'], 79 'address'=>$x['address'], 80 ]); 81},$a)))); 82 83array_walk($a,function($x) use(&$b){ 84 array_walk($b,function(&$y) use($x){ 85 if($y["userinfo"]["namae"]==$x["namae"] and 86 $y["userinfo"]["address"]==$x["address"]){ 87 $y["favoritelist"][]=[ 88 'favorite' => $x['favorite'], 89 'price' => $x['price'], 90 'eart_date' => $x['eart_date'], 91 ]; 92 } 93 }); 94}); 95print_r($b);

投稿2019/11/27 02:55

yambejp

総合スコア116661

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問