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

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

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

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

Q&A

解決済

2回答

760閲覧

PHP連想配列の再編成

picnicpi

総合スコア1

PHP

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

0グッド

0クリップ

投稿2020/09/15 07:08

前提・実現したいこと

元の連想配列($rows)があります

これを「site」と「drink」に応じて分けて、
目的の連想配列($result)を作りたいです

ただし「site」と「drink」は膨大な種類があります

元の連想配列($rows)

php

1$rows = [ 2 ['id'=>1, 'name'=>'いち', 'site'=>'yahoo', 'drink'=>'beer'], 3 ['id'=>2, 'name'=>'にい', 'site'=>'apple', 'drink'=>'wine'], 4 ['id'=>3, 'name'=>'さん', 'site'=>'yahoo', 'drink'=>'beer'], 5 ['id'=>4, 'name'=>'よん', 'site'=>'yahoo', 'drink'=>'beer'], 6 ['id'=>5, 'name'=>'ごお', 'site'=>'apple', 'drink'=>'soda'], 7 ['id'=>6, 'name'=>'ろく', 'site'=>'apple', 'drink'=>'wine'] 8];

###目的の連想配列($result)

php

1$result = [ 2 'search_menu_yahoo_beers' => [ 3 'print_area' => 'search_menu_yahoo_beers', 4 'process' => 'search', 5 'datas' => [ 6 ['id'=>1, 'name'=>'いち', 'site'=>'yahoo', 'drink'=>'beer'], 7 ['id'=>3, 'name'=>'さん', 'site'=>'yahoo', 'drink'=>'beer'], 8 ['id'=>4, 'name'=>'よん', 'site'=>'yahoo', 'drink'=>'beer'] 9 ] 10 ], 11 'search_menu_apple_wines' => [ 12 'print_area' => 'search_menu_apple_wines', 13 'process' => 'search', 14 'datas' => [ 15 ['id'=>2, 'name'=>'にい', 'site'=>'apple', 'drink'=>'wine'], 16 ['id'=>6, 'name'=>'ろく', 'site'=>'apple', 'drink'=>'wine'] 17 ] 18 ], 19 'search_menu_apple_sodas' => [ 20 'print_area' => 'search_menu_apple_sodas', 21 'process' => 'search', 22 'datas' => [ 23 ['id'=>5, 'name'=>'ごお', 'site'=>'apple', 'drink'=>'soda'] 24 ] 25 ] 26]; 27

試したこと

$result = []; foreach ( $rows as $row ) { $print_area = 'search_menu_' . $row['site'] . '_' . $row['drink'] . 's'; $result[$print_area] = [ 'print_area' => $print_area ,'process' => $process ,'datas' => $rows ]; } var_export($result);
$result = []; foreach ( $rows as $row ) { $print_area = 'search_menu_' . $row['site'] . '_' . $row['drink'] . 's'; $result[$print_area][] = [ 'print_area' => $print_area ,'process' => $process ]; $result[$print_area]['datas'][] = $row; } var_export($result);

など…こねくり回していますができません

php入門1ヵ月目の初心者になります
宜しくお願い致します

補足情報(FW/ツールのバージョンなど)

php7.3

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

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

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

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

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

m.ts10806

2020/09/15 07:18

「やったけどできません」ではなく「やってみた結果何が起きているか」を記載してください。 ※質問は編集できます
guest

回答2

0

ベストアンサー

前置き

PHP デバッグ xdebug
あたりで検索して、ブレークポイントを使ってデバッグ出来るようになると正確で効率的なデバッグが出来るようになるのでお勧めです。

回答

foreachの中が若干冗長ですが、元のコードを出来るだけ生かすとこんな感じですかね。

PHP

1<?php 2$rows = [ 3 ['id'=>1, 'name'=>'いち', 'site'=>'yahoo', 'drink'=>'beer'], 4 ['id'=>2, 'name'=>'にい', 'site'=>'apple', 'drink'=>'wine'], 5 ['id'=>3, 'name'=>'さん', 'site'=>'yahoo', 'drink'=>'beer'], 6 ['id'=>4, 'name'=>'よん', 'site'=>'yahoo', 'drink'=>'beer'], 7 ['id'=>5, 'name'=>'ごお', 'site'=>'apple', 'drink'=>'soda'], 8 ['id'=>6, 'name'=>'ろく', 'site'=>'apple', 'drink'=>'wine'] 9]; 10 11 12 13//drinkの種類ごとに配列を組みなおす 14$result = []; 15foreach($rows as $row){ 16 $print_area = 'search_menu_' . $row['site'] . '_' . $row['drink'] . 's'; 17 $result[$print_area]['process'] = 'search'; 18 $result[$print_area]['print_area'] = $print_area; 19 $result[$print_area]['datas'][] = $row; 20} 21 22var_export($result); 23

結果

array ( 'search_menu_yahoo_beers' => array ( 'process' => 'search', 'print_area' => 'search_menu_yahoo_beers', 'datas' => array ( 0 => array ( 'id' => 1, 'name' => 'いち', 'site' => 'yahoo', 'drink' => 'beer', ), 1 => array ( 'id' => 3, 'name' => 'さん', 'site' => 'yahoo', 'drink' => 'beer', ), 2 => array ( 'id' => 4, 'name' => 'よん', 'site' => 'yahoo', 'drink' => 'beer', ), ), ), 'search_menu_apple_wines' => array ( 'process' => 'search', 'print_area' => 'search_menu_apple_wines', 'datas' => array ( 0 => array ( 'id' => 2, 'name' => 'にい', 'site' => 'apple', 'drink' => 'wine', ), 1 => array ( 'id' => 6, 'name' => 'ろく', 'site' => 'apple', 'drink' => 'wine', ), ), ), 'search_menu_apple_sodas' => array ( 'process' => 'search', 'print_area' => 'search_menu_apple_sodas', 'datas' => array ( 0 => array ( 'id' => 5, 'name' => 'ごお', 'site' => 'apple', 'drink' => 'soda', ), ), ), )

投稿2020/09/15 07:31

tanat

総合スコア18716

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

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

picnicpi

2020/09/15 07:40

ありがとうございます!考えていた通りのものでした!ひとつずつ入れてあげるんですね。覚えておきます。
picnicpi

2020/09/15 07:48

xdebugみてきました。こういういのがあったとは知りませんでした。とても有意義なご回答に感謝です!
tanat

2020/09/15 07:59

良かったです。 設定の手間はそれなりにありますが、それ以上のメリットはあるので導入されることをお勧めします。
picnicpi

2020/09/15 08:09

( ◜ω◝ )و. ぐっ
guest

0

php

1<?php 2 3$rows = [ 4 ['id' => 1, 'name' => 'いち', 'site' => 'yahoo', 'drink' => 'beer'], 5 ['id' => 2, 'name' => 'にい', 'site' => 'apple', 'drink' => 'wine'], 6 ['id' => 3, 'name' => 'さん', 'site' => 'yahoo', 'drink' => 'beer'], 7 ['id' => 4, 'name' => 'よん', 'site' => 'yahoo', 'drink' => 'beer'], 8 ['id' => 5, 'name' => 'ごお', 'site' => 'apple', 'drink' => 'soda'], 9 ['id' => 6, 'name' => 'ろく', 'site' => 'apple', 'drink' => 'wine'] 10]; 11 12$result = array_map(function ($row) { 13 switch ($row['drink']) { 14 case 'beer': 15 $print_area = sprintf('search_menu_%s_beers', $row['site']); 16 break; 17 case 'wine': 18 $print_area = sprintf('search_menu_%s_wines', $row['site']); 19 break; 20 case 'soda': 21 $print_area = sprintf('search_menu_%s_sodas', $row['site']); 22 break; 23 } 24 $arr = []; 25 $arr['print_area'] = $print_area; 26 $arr['process'] = 'search'; 27 $arr['datas'] = $row; 28 return $arr; 29}, $rows); 30 31var_dump($result);

*名詞の複数形めちゃくちゃなのも気になります。
beer wine soda 全部単複同型のはず。
data の複数形 datas じゃないし。

投稿2020/09/15 07:18

phper.k

総合スコア3923

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

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

tanat

2020/09/15 07:34

> ただし「site」と「drink」は膨大な種類があります なので、drinkをswitchで分岐するのは命題に沿っていないのではと思います。
phper.k

2020/09/15 07:35

それもそうだけど、出力する形間違ってました
picnicpi

2020/09/15 07:42

ありがとうございます。 複数形の話ですけど、文法を優先するのが一般的なのですか? sがあれば明らかに複数だとわかるのでマイルールでそうしているのですが、一般的にはどうしますかね?
phper.k

2020/09/15 07:44

個人的には、通常の英語と同じにしてます。 ただ、ご指摘のように単複同型は判別が面倒なので、言い換えできる単語がないかその都度、探してます。
picnicpi

2020/09/15 07:45

なるほど、他の単語を探すのが一番いいですね。アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問