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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

0回答

400閲覧

PHPで配列の中に配列を格納し、Smartyで出力したい

saitou_san

総合スコア32

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Smarty

Smartyは、PHPアプリケーションで使用されるテンプレートエンジンです。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2022/12/31 18:23

編集2023/01/01 06:26

前提

PHPにて、配列の中に配列を作成し、それをSmartyで上手く出力する方法が知りたいです.

実現したいこと

・申請を保存するテーブルと申請のグループを保存するテーブルを作成します.
・まず、申請の複数のグループ情報($groupsとする)を配列で取得する.
・foreach($groups as $key =>$group)でループし、$groups[$key]にグループに属する申請の配列を代入する.

php

1//条件に合うグループを入手 2$groups= $KgroupModel->get_log($_SESSION[_MEMBER_AUTHINFO]['id'],$sql_sub_day,$sql_day,$sql_sort_key,$sql_grade,$sql_reason,$sql_comment); 3 foreach($groups as $key=>$group){ 4   //各グループのtable属性にグループに属する申請のリストを代入 5 $groups[$key]['table'] = $kessyokuModel->getKessyokuByGroup($group['group_id']); 6 }

・各グループをSmartyの{foreach}を使い表で表示し、それぞれのレコードに配置されているボタンを押したら、グループに属してる申請を表示する.

smarty

1{foreach item=item from=$groups} 2<!--省略--> 3 {foreach item=table from={$item.table}} 4 {$table.date} 5 {/foreach} 6{/foreach}

発生している問題・エラーメッセージ

Warning: Illegal string offset 'date' in ~

$KgroupModel->get_log()の中身

php

1 public function get_log($id,$sub_day,$day,$sort,$grade,$reason,$comment){ 2 $sql = <<<EOS 3 SELECT * FROM Kgroup WHERE id = :id 4 EOS; 5//省略 6 try { 7 $stmh = $this->pdo->prepare($sql); 8    //省略 9 } 10 $stmh->bindValue(':id', $id, PDO::PARAM_STR ); 11 $stmh->execute(); 12 // 検索件数を取得 13 $count = $stmh->rowCount(); 14 // 検索結果を多次元配列で受け取る 15 if(!isset($count)){ 16 $count = 0; 17 } 18 $i=0; 19 $data = []; 20 while ($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 21 foreach( $row as $key => $value){ 22 $data[$i][$key] = $value; 23 } 24 $i++; 25 } 26 } catch (PDOException $Exception) { 27 print "エラー:" . $Exception->getMessage(); 28 } 29 return [$data, $count]; 30 } 31}

KgroupテーブルのCREATE文

sql

1CREATE TABLE Kgroup ( 2 group_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, 3 id MEDIUMINT UNSIGNED NOT NULL, 4 sub_date DATETIME, 5 grade VARCHAR(1), 6 reason VARCHAR(700), 7 app VARCHAR(3), 8 comment VARCHAR(700), 9 state DATETIME, 10 app_date DATETIME, 11 PRIMARY KEY(group_id) 12);

$kessyokuModel->getKessyokuByGroup()の中身

php

1 public function getKessyokuByGroup($group_id){ 2 $sql = <<<EOS 3 SELECT * FROM kessyoku WHERE group_id = :group_id 4 EOS; 5 6 try { 7 $stmh = $this->pdo->prepare($sql); 8 $stmh->bindValue(':group_id', $group_id, PDO::PARAM_STR ); 9 $stmh->execute(); 10 11 $i=0; 12 $data = []; 13 while ($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 14 foreach( $row as $key => $value){ 15 $data[$i][$key] = $value; 16 } 17 $i++; 18 } 19 } catch (PDOException $Exception) { 20 print "エラー:" . $Exception->getMessage(); 21 } 22 return $data; 23 }

kessyokuテーブルのCREATE文

sql

1CREATE TABLE kessyoku ( 2 kessyoku_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, 3 group_id MEDIUMINT UNSIGNED NOT NULL, 4 id MEDIUMINT UNSIGNED NOT NULL, 5 date DATETIME, 6 bre BOOLEAN, 7 lun BOOLEAN, 8 din BOOLEAN, 9 PRIMARY KEY(kessyoku_id) 10); 11

試したこと

・グループの提出日({$group.sub_date})など、配列$groupsの直下の値は出力できますが、
$groups[$key]['table']['date'] ({$group.table.date})のように2つ下の値は出力できず、エラーメッセージが出ます.

Notice: Undefined index: date in

また、$groups[$key]['table']にただの値を代入すると正常に出力されます。

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

使用ブラウザ:Chrome
PHPバージョン:PHP7.4

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

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

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

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

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

m.ts10806

2022/12/31 22:59

そもそもassignする前の処理で同名変数を上書きしてしまってるように見えるのですが、デバッグで変数が保持する情報は追ってみましたか?
yuma.inaura

2023/01/01 03:26

$groups にはどんな値(配列、ハッシュなど)が入ってるんですか?
saitou_san

2023/01/01 06:05

``` CREATE TABLE Kgroup ( group_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, id MEDIUMINT UNSIGNED NOT NULL, sub_date DATETIME, grade VARCHAR(1), reason VARCHAR(700), app VARCHAR(3), comment VARCHAR(700), state DATETIME, app_date DATETIME, PRIMARY KEY(group_id) ); ``` のデータを配列に格納し、$KgroupModel->get_log()関数で返しています.
yuma.inaura

2023/01/01 06:11

具体的にはどんな配列なのでしょうか?
saitou_san

2023/01/01 06:40 編集

$data[0~の数字][レコードの要素の名前('sub_date'や'id')など] = 個々のレコードの値 Ex. $data[3]['comment'] == 'hello' ※Smartyでの表示 {foreach item=item from=$groups} {item.comment} //hello {/foreach} のような感じです. 私は、$data[3][table]に配列を代入して表示したいです. Ex. $data[3]['table']['1']['date'] == '2023/01/01 ~' ※Smartyでの表示 {foreach item=item from=$groups} {item.comment} //hello {foreach item= table from={$item.table}} {$table.date} //'2023/01/01 ~' {/foreach} のような感じで出力したいです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問