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

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

詳細はこちら
PHP

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

Q&A

解決済

1回答

652閲覧

多次元配列の作成方法について

kinisinai

総合スコア28

PHP

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

0グッド

0クリップ

投稿2019/11/21 12:45

編集2019/11/21 14:09

2つある配列を1つの配列にまとめて1つとして扱いたいのですが1つにまとめる方法が分からず困っています。

イメージとしては2つある配列をfor文などでループして1つにまとめたいのですがやり方がわかりません。
質問文が拙いですがお力を貸していただけると嬉しいです。
よろしくお願いします。

下記の配列を1つのものとしたい

PHP

1$hogename[] = array('id'=>1,'name'=>'hogehoge','gender'=>'男性'); 2$hogename[] = array('id'=>2,'name'=>'hogehoge2','gender'=>'女性'); 3$hogename[] = array('id'=>3,'name'=>'hogehoge3','gender'=>'男性'); 4 5$itemlist[] = array('id'=>1,'iteminfo' => array('木の枝','皮の服','鉄の鎧')); 6$itemlist[] = array('id'=>2,'iteminfo' => array('鉄の枝','鉄の服','鉄鉄の鎧')); 7$itemlist[] = array('id'=>3,'iteminfo' => array('鋼の枝','鋼の服','鋼の鎧')); 8 9$i = 0; 10 11foreach ($hogename as $hogenamez) { 12 foreach ($itemlist as $itemlistz) { 13 if ($hogenamez['id'] == $itemlistz['id'] ) { 14 $list[$i] = array( 15 'nameinfo' => $hogenamez, 16 'iteminfo' => array( 17 $itemlistz['iteminfo'] 18 ) 19 ); 20 } 21 } 22 $i ++; 23 } 24

idが同じなのでhogehogeさんの持ち物として下記のような結果が得られるようにしたい

最終イメージとしては

array ( 'nameinfo' => array ( 'id' => '1', 'name' => 'hogehoge', 'gender' => '男性', ), 'iteminfo' => array ( 0 => '木の枝',    1 => '皮の服',    2 => '鉄の鎧' ), ), ) array ( 'nameinfo' => array ( 'id' => '2', 'name' => 'hogehoge2', 'gender' => '女性', ), 'iteminfo' => array ( 0 => '鉄の枝',    1 => '鉄の服',    2 => '鉄鉄の鎧' ), ), ) array ( 'nameinfo' => array ( 'id' => '3', 'name' => 'hogehoge3', 'gender' => '男性', ), 'iteminfo' => array ( 0 => '鋼の枝',    1 => '鋼の服',    2 => '鋼の鎧' ), ), )

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

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

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

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

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

m.ts10806

2019/11/21 12:54 編集

2つある配列がどんな配列なのかどこにもないですし、やりたい結果だけ出されても誰もなんとも言えません。 また、分からないなりに試したことがあるはずなので、質問本文に追記してください
kinisinai

2019/11/21 13:20

すみません。今追記させていただきました。
m.ts10806

2019/11/21 13:23

文法エラーがあるとかそういうところからですか?
m.ts10806

2019/11/21 13:27

配列が提示の内容通りでidが1個しかないならループすら不要ですけど。 おそらく以前の質問でも指摘されてたかと思いますが、もう少し仕様をきちんと考えられたほうが良いです。 でないと、自身が得られたいアドバイスが得られないばかりか、回答者が好き勝手に解釈した大喜利が始まります。
kinisinai

2019/11/21 13:30

すみません。初心者なので仕様と言われましてもこれが僕の精一杯の考えての質問なので・・・
kinisinai

2019/11/21 13:31

今回は例としてidは1つですが2、3と増やしていきたいと考えています
m.ts10806

2019/11/21 13:34

仕様という単語で構えてしまうのも致し方ないかもしれませんが、 「どういう情報を元に何をしたいか」が仕様です。それは質問者しか握っていません。 提示された情報が本当に全てであれば回答した通りループ不要ですし、 「idが同じなので」というところから、2つの配列には複数のidがあってそれぞれマッチさせて配列を作る必要があるのかとか。 そもそも今回の配列はどこからどのように発生するものなのかとか。 それが「前提や背景を含めた仕様」です。 以前の質問でも「パターンをもっと出してほしい」という依頼を受けていたかと思います。 それと理屈は同じです。
m.ts10806

2019/11/21 13:36

>今回は例としてidは1つですが2、3と増やしていきたいと考えています その「増えたときの考慮が必要かどうか」が現在の質問内容では分かりません。 ひとまず、「増えたときの考慮が必要であることが分かるように」質問内容を調整するのと、 「増えたときの配列」を作ってください。 (あとこのデータはどこからどのように来るものなのか。固定値なら学習目的?大目的は必要ですね)
m.ts10806

2019/11/21 13:40

細かいですが、全角数値と半角数値はイコールにはなりませんので、ご注意を。 エラーに悩んでいるわけではないのでしたらそのあたりは配慮してもらえると答えやすいです。 本当にそういうコードを組んでいるのか、転記ミスなのかはこちらは分かりませんので。
kinisinai

2019/11/21 13:41

僕の以前の質問も色々ご指摘いただいていたので前の質問を知っている程でお話しさせていただきます。 僕なりにまずはこの前の質問を噛み砕いてまずは固定値で今回のような配列を作成してみようと思い自分で試行錯誤しましたが中々うまく実現できず今回またこちらに質問させていただきました。 増えた時のパターンの配列、出力結果の方も追記しましたのでよければ目を通していただけると幸いです。
kinisinai

2019/11/21 13:42

ご指摘ありがうございます。数字の方は僕のミスなので書き換えさせていただきました。
m.ts10806

2019/11/21 13:47 編集

私はたまたま以前の質問を見ていて傾向を分かったうえで話ができますが、 ほとんどの人は質問もあなた自身も初見というのはお忘れなく。。。 (回答者は確かに質問者の人となりを過去質問から得ようとしますが、深くまで見ているとは限りませんし、全く見ない人もいますし、私も記憶は無限ではないので、しばらく見てなかった場合に本来触ってはいけないような危ない人に触ってしまうこともあります)
m.ts10806

2019/11/21 13:48

genderも'' つけといてくださいね。このままだと未定義の定数エラーが出ます。
kinisinai

2019/11/21 13:52

すみません。以後気をつけます。 genderの指摘ありがとうございます。修正しました。
m.ts10806

2019/11/21 13:56

ちなみに、結果イメージにそれぞれidがついてないですが、それはいいんですね? データをどう使いたいためのこの結果か知らないですが(そこも仕様で決められてないといけないところ) idが消えるとその後のデータの紐づけに苦労するのではないかと思っています。
kinisinai

2019/11/21 14:10

結果イメージのnameinfoの方にはidが欲しいので追加させていただきました。 不足点が多く申し訳ありません。
guest

回答1

0

ベストアンサー

既にコメントで指摘していますが、本当に提示の情報しか配列がないならループすら不要です。

php

1$hogename[] = array('id'=>1,'name'=>'hogehoge','gender'=>'男性'); 2 3$itemlist[] = array('id'=>1,'iteminfo' => array('木の枝','皮の服','鉄の鎧')); 4 5$mergeArray = []; 6$mergeArray['nameinfo']= $hogename[0]; 7//unset($mergeArray['nameinfo']['id']); 8$mergeArray['iteminfo']= $itemlist[0]['iteminfo']; 9 10 11var_dump($mergeArray);

他にも要件があるのでしたら、
前提や背景、仕様はきちんと提示しましょう。
赤の他人である回答者には質問に書いてあることが全てです。

追記された配列を元に。

効率的にコードを組もうとしたら、対象の情報の法則性を見つけることです。
本当に提示された通りであれば、2つの配列は同じ順番でidが振られているということ。
でしたら、「idが同じだったら」は不要です。

php

1$hogename[] = ['id'=>1,'name'=>'hogehoge','gender'=>'男性']; 2$hogename[] = ['id'=>2,'name'=>'hogehoge2','gender'=>'女性']; 3$hogename[] = ['id'=>3,'name'=>'hogehoge3','gender'=>'男性']; 4 5$itemlist[] = ['id'=>1,'iteminfo' => ['木の枝','皮の服','鉄の鎧']]; 6$itemlist[] = ['id'=>2,'iteminfo' => ['鉄の枝','鉄の服','鉄鉄の鎧']]; 7$itemlist[] = ['id'=>3,'iteminfo' => ['鋼の枝','鋼の服','鋼の鎧']]; 8 9$list = []; 10foreach($hogename as $num=>$data){ 11 // if($itemlist[$num]['id'] === $data['id']){ 12 //unset($data['id']); 13 $list[] = [ 14 'nameinfo'=>$data, 15 'iteminfo'=>$itemlist[$num]['iteminfo'], 16 ]; 17 // } 18} 19var_dump($list);

ずれている可能性があるかどうか分からなかったのでこのような形。
配列がそれぞれ作られているので、IDを重複している配列もありえるかもしれません。

それによって対応方針が全く異なります。
重複していたらどっちかを残すとかそもそも処理しないとか、それも仕様ですね。
仕様・設計に熟考が必要な要件です(そうでなく学習目的ならもっと簡単な仕様から考えた方が良いです)

nameinfoの方にはidが欲しいので

ならこっちにつけないと紐づけにならないと思いますし、
今後のデータの扱いが結構面倒です。

php

1array ( 2 1 => //キーにID 3 array ( 4 'nameinfo' => 5 array ( 6 'name' => 'hogehoge', 7 'gender' => '男性', 8 ), 9 'iteminfo' => 10 array ( 11 0 => '木の枝', 12 1 => '皮の服', 13 2 => '鉄の鎧', 14 ), 15 ), 16 2 => //キーにID 17 array ( 18 'nameinfo' => 19 array ( 20 'name' => 'hogehoge2', 21 'gender' => '女性', 22 ), 23 'iteminfo' => 24 array ( 25 0 => '鉄の枝', 26 1 => '鉄の服', 27 2 => '鉄鉄の鎧', 28 ), 29 ), 30 3 => //キーにID 31 array ( 32 'nameinfo' => 33 array ( 34 'name' => 'hogehoge3', 35 'gender' => '男性', 36 ), 37 'iteminfo' => 38 array ( 39 0 => '鋼の枝', 40 1 => '鋼の服', 41 2 => '鋼の鎧', 42 ), 43 ), 44)

投稿2019/11/21 13:30

編集2019/11/21 14:16
m.ts10806

総合スコア80875

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

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

kinisinai

2019/11/21 14:16

ありがとうございます。これを元にこの後も違うパターンやおっしゃっていただいた通り重複していいタラなどを自分で考えていきたいと思います。
m.ts10806

2019/11/21 14:18

コード組む前に仕様決めてから書いてください。 どんな小さなコードであろうと設計が先です。
m.ts10806

2019/11/21 14:23 編集

例えば「”こんにちは”と画面出力する」という大目的のプログラムを組む場合、 「サイズは?色は?書式は?位置は?」など決めてから書きます。 書きながら決めるものではありません(非効率です) それも「段取り」なので1つ1つ確実にしていくべきです。 逆に今からその「段取り」を気にできるようになると成長度合いが全く違ってきます。 質問もいい質問が出来て早い段階で解決できるし、質問することなく自分でできるようになってくるでしょう
kinisinai

2019/11/21 14:31

とても参考になる意見ありがとうございます。
m.ts10806

2019/11/21 14:42

いまいち受け入れられた感がないというか、理解されてる感じがないのでアドバイスした意味なかった感が否めないですけど、要件や仕様を背景や前提含めてきちんと書かないとどんな熟練者でもコードは書けないということがわかってもらえたらそれで良いです。 初心者なら尚更事細かに考える必要があります。 コードは組んだ通りにしか動きませんしね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問