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

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

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

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

Q&A

解決済

3回答

2440閲覧

配列をグループごとに表示する方法

bws

総合スコア98

PHP

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

0グッド

0クリップ

投稿2018/11/23 08:37

編集2018/11/23 09:10

下のような配列を画像のように表示する場合、どのようにするのが一般的でしょうか?
配列は多次元配列などにして整えた方が良いでしょうか?

foreachでifやswitchでクライアントと都道府県を振り分けて表示していたのですが、わかりにくいし無駄が多いような気がします。

アドバイスいただけませんでしょうか、よろしくお願いします。

配列

PHP

1$shop_list = array( 2 '0' => array( 3 'code' => 1, 4 'client_code' => 2, 5 'client_name' => 'PHP書店', 6 'pref_code' => 13, 7 'pref_name' => '東京都', 8 'shop_name' => '渋谷', 9 ), 10 '1' => array( 11 'code' => 1, 12 'client_code' => 1, 13 'client_name' => 'JS書店', 14 'pref_code' => 13, 15 'pref_name' => '東京都', 16 'shop_name' => '渋谷', 17 ), 18 // 省略 19);

実現したい画面

イメージ説明

追記

配列はshop,pref,clientテーブルから取り出したデータです。

shopテーブル
code
clinet_code
pref_code
name

prefテーブル
code
name

clientテーブル
code
name

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

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

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

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

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

guest

回答3

0

ベストアンサー

データとしては現在の形で持っておいて、
出力する直前に表示形式に合わせた配列構造に整形するというのはよくある形かなと思います。

PHP

1<?php 2 3$shop_list = array( 4 '0' => array( 5 'code' => 1, 6 'client_code' => 2, 7 'client_name' => 'PHP書店', 8 'pref_code' => 13, 9 'pref_name' => '東京都', 10 'shop_name' => '渋谷', 11 ), 12 '1' => array( 13 'code' => 1, 14 'client_code' => 1, 15 'client_name' => 'JS書店', 16 'pref_code' => 13, 17 'pref_name' => '東京都', 18 'shop_name' => '渋谷', 19 ), 20 '2' => array( 21 'code' => 1, 22 'client_code' => 1, 23 'client_name' => 'JS書店', 24 'pref_code' => 1, 25 'pref_name' => '北海道', 26 'shop_name' => '札幌', 27 ), 28 '3' => array( 29 'code' => 1, 30 'client_code' => 1, 31 'client_name' => 'JS書店', 32 'pref_code' => 13, 33 'pref_name' => '東京都', 34 'shop_name' => '原宿', 35 ), 36 // 省略 37); 38 39$shop_list_for_view = convertListForView($shop_list); 40var_dump($shop_list_for_view); 41displayShopList($shop_list_for_view); 42 43function convertListForView($shop_list){ 44 $list_for_view = []; 45 foreach($shop_list as $shop){ 46 //書店名と県名を添え字に使って表示用のツリー構造を表現 47 $list_for_view[$shop["client_name"]][$shop["pref_name"]][] = $shop; 48 } 49 50 //必要に応じてソートしてから返す 51 return $list_for_view; 52} 53 54function displayShopList($shop_list_for_view){ 55 foreach($shop_list_for_view as $client_name => $client_list){ 56//実際はHTMLを出力 57 echo $client_name; 58 echo PHP_EOL; 59 foreach($client_list as $pref_name => $shop_list){ 60 echo "*".$pref_name; 61 echo PHP_EOL; 62 foreach($shop_list as $shop){ 63 echo "**".$shop["shop_name"]."店"; 64 echo PHP_EOL; 65 } 66 } 67 } 68}
array(2) { ["PHP書店"]=> array(1) { ["東京都"]=> array(1) { [0]=> array(6) { ["code"]=> int(1) ["client_code"]=> int(2) ["client_name"]=> string(9) "PHP書店" ["pref_code"]=> int(13) ["pref_name"]=> string(9) "東京都" ["shop_name"]=> string(6) "渋谷" } } } ["JS書店"]=> array(2) { ["東京都"]=> array(2) { [0]=> array(6) { ["code"]=> int(1) ["client_code"]=> int(1) ["client_name"]=> string(8) "JS書店" ["pref_code"]=> int(13) ["pref_name"]=> string(9) "東京都" ["shop_name"]=> string(6) "渋谷" } [1]=> array(6) { ["code"]=> int(1) ["client_code"]=> int(1) ["client_name"]=> string(8) "JS書店" ["pref_code"]=> int(13) ["pref_name"]=> string(9) "東京都" ["shop_name"]=> string(6) "原宿" } } ["北海道"]=> array(1) { [0]=> array(6) { ["code"]=> int(1) ["client_code"]=> int(1) ["client_name"]=> string(8) "JS書店" ["pref_code"]=> int(1) ["pref_name"]=> string(9) "北海道" ["shop_name"]=> string(6) "札幌" } } } } PHP書店 *東京都 **渋谷店 JS書店 *東京都 **渋谷店 **原宿店 *北海道 **札幌店

投稿2018/11/23 09:40

tanat

総合スコア18713

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

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

bws

2018/11/23 10:15

まさにこれがやりたかったという形です!ありがとうございます。 コードまで丁寧に書いて頂いてありがとうございます。 取り出す時の形、出力する直前に整形するという点、また配列名などもとても参考になりました。
guest

0

テーブルのクエリー結果なのだとしたら、
まずSELECT文の段階でORDER BY句を駆使して並べ替えをしっかりやっとくこと。

次に、私がよくやる手なんだけど、
前行のデータを保持する変数を用意して、
前行と
・client_nameが変わったらどうする、
・pref_nameが変わったらどうする、
・shop_nameが変わったらどうする
っていう処理を設けると、
この手のグループ分け表示は解決できてしまう。

・client_nameが変わったらどうする
→1階層目グループの境目を表示する

・pref_nameが変わったらどうする
→2階層目グループの境目を表示する

みたいな感じになるだろうか?

投稿2018/11/23 09:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bws

2018/11/23 10:12

ありがとうございます! データベースから取り出す際に並び替えをしっかりとしていなかった為、表示するときのコードがわかりにくくなっていました。とても参考になりました。
guest

0

データ量が少ないのであれば記載されているような形式で問題ないと思います。
もし、それなりのデータ量があったり、今後追加や更新が頻繁に起こるのであれば DB 化することを考えた方が良いと思います。
その際には、いわゆる"正規化" をすれば、「わかりにくいし無駄が多い」という問題は多少解決されると思います。

配列の形でも正規化は行うことはできるので、もしご存じなければ DB の正規化について調べてみてください。

投稿2018/11/23 08:53

ssasaki

総合スコア1167

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

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

bws

2018/11/23 09:13

アドバイスありがとうございます。 DBの正規化という言葉を初めて聞きました。重複したデータを排除することでわかりやすく管理するというのは理解できたのですが、今回のケースではどのように活かせば良いでしょうか? 配列はデータベースから取り出したデータです。 配列の表示方法というよりはデータベースの設計、取り出し方が悪いのでしょうか?
ssasaki

2018/11/23 09:31

既にDB化されていたのですね。 DB を設計する上で正規化は基礎の基礎ですので是非理解しておくことをおすすめします。 ただ、本件について言えば、追記されたテーブル構造を見ると正規化されているように見えます。 そのテーブル構造と画像に表示されている最終形だけを考えれば、DB データを配列に格納する箇所で改善の余地があると思います。 ちなみに最初に書いた通り、掲載されている配列の形でも悪くはないと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問