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

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

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

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

Q&A

解決済

1回答

826閲覧

多次元配列をtableの各セルにネスト構造で出力したい

pegy

総合スコア243

PHP

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

0グッド

0クリップ

投稿2021/05/28 03:47

多次元配列をテーブルのネスト構造で表現したいと考えており、 表現したい結果のテーブルは例えば以下の通りです。

1階層目2階層目3階層目
Category1
Category1-1
Category1_3_1
Category1_3_2
Category1_3_3

これを出力するために、以下のようなコーディングをいたしました。

php

1$index_array=[ 2 ["Category1", 3 ["Category1_1",["Category1_1_1","Category1_1_2","Category1_1_3"], 4 "Category1_2",["Category1_2_1","Category1_2_2"], 5 "Category1_3",["Category1_3_1","Category1_3_2","Category1_3_3"] 6 ] 7 ], 8 ["Category2", 9 ["Category2_1",["Category2_1_1","Category2_1_2","Category2_1_3"], 10 "Category2_2",["Category2_2_1","Category2_2_2"], 11 "Category2_3",["Category2_3_1","Category2_3_2","Category2_3_3"] 12 ] 13 ], 14 ["Category3", 15 ["Category3_1",["Category3_1_1","Category3_1_2","Category3_1_3"], 16 "Category3_2",["Category3_2_1","Category3_2_2"], 17 ] 18 ], 19] 20 21 <table> 22 <tbody> 23 <?php 24 $index_table=""; 25 for ($i=0; $i <count($index_array) ; $i++) { 26 $index_table.="<tr><td>".$index_array[$i][0]."</td><td></td><td></td></tr>"; 27 if (!(is_null($index_array[$i][1]))) { 28 for ($j=0; $j <count($index_array[$i][1]) ; $j++) { 29 $index_table.="<tr><td></td><td>".$index_array[$i][1][$j]."</td><td></td></tr>"; 30 if (!(is_null($index_array[$i][1][$j][1]))) { 31 for ($k=0; $k <count($index_array[$i][1][$j][1]) ; $k++) { 32 $index_table.="<tr><td></td><td></td><td>".$index_array[$i][1][$j][1][$k]."</td></tr>"; 33 } 34 } 35 } 36 } 37 } 38 echo $index_table; 39 ?> 40 </tbody> 41 </table>

その結果、以下の通り、3階層目について、文字列をcountして出力しているように思えます。

html

1 2Category1 3Category1_1 4a 5Array 6C 7a 8t 9Category1_2 10a 11Array 12C 13a 14Category1_3 15a 16Array 17C 18a 19t 20Category2 21Category2_1 22a 23Array 24C 25a 26t 27Category2_2 28a 29Array 30C 31a 32Category2_3 33a 34Array 35C 36a 37t 38Category3 39Category3_1 40a 41Array 42C 43a 44t 45Category3_2 46a 47Array 48C 49a

どこのコーディングにミスがあるか分からず、ご助言いただければ幸いです。
また、このようなネスト構造をforとifの組み合わせで構築していくのは非常に可読性が低く他に良い方法がないかを検討していおります。配列自体が所与である場合、ここからより良い方法で目的とする構造を出力する良いアイデアは考えられるでしょうか?

よろしくお願い申し上げます。

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

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

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

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

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

m.ts10806

2021/05/28 03:52

そもそも、その形のテーブルをhtmlだけで組めていますか?
guest

回答1

0

ベストアンサー

データ構造がおかしい。
こういうものとして、このままゴリ押しするのは、コーディングがしんどいのではないかと。

ある階層での並べ替えとか考慮してないよね。
2階層目が、偶数番に文字列、奇数番に配列が来て、同列で扱われているなんて。偶数番と奇数番をセットで管理するのを強制されるとか、辛い。
データベースから読み出して、この構造を作るのもしんどいかも。

php

1<?php 2 3$index_array=[ 4 ["Category1", 5 ["Category1_1",["Category1_1_1","Category1_1_2","Category1_1_3"], 6 "Category1_2",["Category1_2_1","Category1_2_2"], 7 "Category1_3",["Category1_3_1","Category1_3_2","Category1_3_3"] 8 ] 9 ], 10 ["Category2", 11 ["Category2_1",["Category2_1_1","Category2_1_2","Category2_1_3"], 12 "Category2_2",["Category2_2_1","Category2_2_2"], 13 "Category2_3",["Category2_3_1","Category2_3_2","Category2_3_3"] 14 ] 15 ], 16 ["Category3", 17 ["Category3_1",["Category3_1_1","Category3_1_2","Category3_1_3"], 18 "Category3_2",["Category3_2_1","Category3_2_2"], 19 ] 20 ], 21]; 22 23var_export($index_array);

array (
0 =>
array (
0 => 'Category1',
1 =>
array (
0 => 'Category1_1',
1 =>
array (
0 => 'Category1_1_1',
1 => 'Category1_1_2',
2 => 'Category1_1_3',
),
2 => 'Category1_2',
3 =>
array (
0 => 'Category1_2_1',
1 => 'Category1_2_2',
),
4 => 'Category1_3',
5 =>
array (
0 => 'Category1_3_1',
1 => 'Category1_3_2',
2 => 'Category1_3_3',
),
),
),
1 =>
array (
0 => 'Category2',
1 =>
array (
0 => 'Category2_1',
1 =>
array (
0 => 'Category2_1_1',
1 => 'Category2_1_2',
2 => 'Category2_1_3',
),
2 => 'Category2_2',
3 =>
array (
0 => 'Category2_2_1',
1 => 'Category2_2_2',
),
4 => 'Category2_3',
5 =>
array (
0 => 'Category2_3_1',
1 => 'Category2_3_2',
2 => 'Category2_3_3',
),
),
),
2 =>
array (
0 => 'Category3',
1 =>
array (
0 => 'Category3_1',
1 =>
array (
0 => 'Category3_1_1',
1 => 'Category3_1_2',
2 => 'Category3_1_3',
),
2 => 'Category3_2',
3 =>
array (
0 => 'Category3_2_1',
1 => 'Category3_2_2',
),
),
),
)

投稿2021/05/28 04:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pegy

2021/05/28 05:10

ありがとうございます。データ構造の持ち方自体について、再検討させていただきます。 少し、逸れてしまうかもしれませんが例えば、当該データをRDBで保有する場合には、 col1|col2|col3 Category1|Category1-1|Category1_1_1 のような持ち方が一般的に適正なのでしょうか? ただその場合、fetchの際に取得する際に、以下の順番で取得して出力するために順番のようなフラグを付けばければ正しい順番を担保できないと考えており、RDBの格納の方法として、最適解を考えております。 array ( 0 => 'Category1_1_1', 1 => 'Category1_1_2', 2 => 'Category1_1_3', ) もし、本件についても一般的な視点からネストかされたデータの格納方法についてアドバイスを頂けるととてもありがたいです。 【追記】 下記、同様の回答がDuplicate状態になっていると思います。可能であれば削除をお願いできれば幸いです。
退会済みユーザー

退会済みユーザー

2021/05/28 08:18

データの持ち方、すなわち構造設計に関しては、アルゴリズム事典の類を読まれることをおすすめします。 とはいえ、設計をどう実装に落とし込むかは言語や環境に依存する部分なのですが。 ありがちなのは、id, name, parent_id っていうカラムのテーブルを作って、 自idをparent_idに持つレコードが属する子階層を示す、というものとか。 この構造は、自分が何回層目に居るかがわかりにくくなりますが、 構造まるごと階層間移動するのに都合がいいです。
pegy

2021/05/28 15:08

なるほど、3階層にして複数の海藻で設計して、それぞれの依存関係を示すカラムを持たせてみましたが、おっしゃる方法が合理的に思えます。また、このようなケースでもアルゴリズムを学ぶことになるのですね、、今まで避けてきましたが、いよいよ真剣に取り組んでみようと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問