こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Smarty 三次元配列を使いたい

最近Smartyを使い始めた者です。

以下のような多次元配列を、$smarty->assign('data', $data); します。

$data =
array( [0] => array( [id] => 23 [comment] => 'aaa' [name] = array( [0] => 'xxx' [1] => 'yyy' ))
[1] => array( [id] => 24 [comment] => 'bbb' [name] = array( [0] => 'zzz' ))
[2] => array( [id] => 25 [comment] => 'ccc' [name] = array( [0] => 'ttt' [1] => 'uuu' ))
)


そして、以下のようなテーブルを表示させたいのです。

|-------------------|
| 23  | aaaa | xxxx |
|    |     |------|
|    |     | yyyy |
|-------------------|
| 24  | bbbb | zzzz |
|-------------------|
| 25  | cccc | tttt |
|    |     |------|
|    |     | uuuu |
|-------------------|
<td>タグのrowspan属性を使おうと思っています。
{foreach}をつかって、以下のようなものを書きましたが、駄目でした。

{foreach from=$data item=value01 name=kiji}
<tr>
<td rowspan="{$value01.numgoods}">{$value01.id}</td>
<td rowspan="{$value01.numgoods}">{$value01.comment}</td>

{foreach from=$value01 item=value02 name=goods}
{if $smarty.foreach.goods.first}
<td>{$value02.name.0]</td></tr>
{else}
<tr>
<td>{$value.name.1}</td>
</tr>
{/if}
{/foreach}
{/foreach}
エラー表示は、
syntax error: unrecognized tag: $value02.name.0 です

本当は、$value02.name の.0を三次元での要素数分だけ自動でループしてほしいのですが、その書き方がわかりません。
ネットをあさっても、これと言うサイトを見つけれません。
そもそも、三次元目の要素を取得するsmartyの方法がわかりません。

どなたかご教授の程、よろしくお願いいたします。

投稿日時 - 2008-04-22 19:38:48

QNo.3968018

すぐに回答ほしいです

質問者が選んだベストアンサー

細かい解説を書く時間がないんで、回答例だけ載せます。

<?php
require_once 'Smarty/libs/Smarty.class.php';

$data =
array(array( 'id' => 23, 'comment' => 'aaa', 'name' => array('xxx', 'yyy')),
array( 'id' => 24, 'comment' => 'bbb', 'name' => array('zzz' )),
array( 'id' => 25, 'comment' => 'ccc', 'name' => array('ttt', 'uuu' )));

$sm = new Smarty();
$sm->assign('data', $data);
$sm->display('testArray.tpl');
?>

<table border="1">
{foreach from=$data item='row'}
<tr>
<td rowspan={$row.name|@count}>{$row.id}</td>
<td rowspan={$row.name|@count}>{$row.comment}</td>
{assign var='trPrinted' value=1}
{foreach from=$row.name item='name'}
{if $trPrinted == 0}
<tr>
{else}
{assign var='trPrinted' value=0}
{/if}
<td>{$name}</td>
</tr>
{/foreach}
{/foreach}
</table>

肝は、@countで長さを取得している所、最後のカラムで<tr>を出すかどうかを、変数を使ってコントロールしている所です。
なお、Smartyでは、整数キーと、連想配列では、書き方が違います。
$a.key、$a[0]のように書き分けます。

投稿日時 - 2008-04-23 07:14:31

お礼

ご回答ありがとうございます。

@countと{assign}、知りませんでした。とても参考になりました。

投稿日時 - 2008-04-23 15:30:18

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問