前提
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
あなたの回答
tips
プレビュー