• 締切済み

smartyのforeachの使い方がよくわかりません。

Smartyを使ってサイトを作っていて連想配列でネストしている配列を{section}でループさせています。 はじめの配列はうまく取り出せてループできるのですが、ネストした配列の中身を取得して表示させることができません。{section}内でさらに配列の要素をループさせたい場合どのようにしたらよいのでしょうか? print_rの結果はこんな感じです。[test] => Arrayの配列を取り出したいのですがどのようにしたらよいでしょうか? Array ( [0] => Array ( [id] => 7 [postdate] => 2008/02/21/ 06:48:10 [count] => 0 [test] => Array ( [0] => Array ( [id] => 4 [title] => あああああああああ) [1] => Array ( [topicid] => 6 [postdate] => 2008/02/19/ 13:44:41

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

  • yexob328
  • ベストアンサー率25% (1/4)
回答No.2

{foreach}も{section}もネスト可能で、あまり使い方は変わりません。 {* 1 *} {foreach item=item from=$arr} {$item} {/foreach} {* 2 *} {section name=name loop=$arr} {$arr[name]} {/section} 1と2は同じ出力結果です。 質問にある配列も{section}{foreach}どちらを使用してもかまわないと思いますが、 {foreach item=item from=$arr key=$key} とすると、{$key}でkeyの値を表示できますので、1つの連想配列の場合は{foreach}の方が便利な印象です。 #1さんがおっしゃるように{foreach}を使用した方が簡単な文になります。 {section loop=$arr name=arr_key} {foreach item=test_arr key=key from=$arr[arr_key].test} {foreach item=test_item key=test_key from=$test_arr} ・{$test_key}:{$test_item}<br> {/foreach} <br> {/foreach} <br> {/section} ***** 出力 ***** ・id:4 ・title:あああああああああ ・topicid:6 ・postdate:2008/02/19/ 13:44:41

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

{section} ではなく、{foreach}を使ってください 感覚としては、PHPのforeachと同じです 何階層でも、お好きなくらいネストしていってください {foreach name=outer item=contact from=$contacts} <hr /> {foreach key=key item=item from=$contact} {$key}: {$item}<br /> {/foreach} {/foreach}

関連するQ&A

  • smarty foreach 半角スペース

    いつもお世話になっています。 phpより連想配列をsmartyにassignし、 smarty側でforeachで出力しているのですが、 要素間に無駄なスペースが混入します。 回避方法はあるのか教えて頂けないでしょうか。 [php] $arr = array('a' => 1, 'b' => 2); [smarty] {foreach from=$arr item=item} {item}: {/foreach} [出力] 1 : 2 ※本来1:2と出力させたい 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • smartyのforeachの使い方

    仮に$strが以下のような配列を持っている場合smartyのtpl側で 出力させたいのですがうまくいきません。 Array ( [0] => Array ( [id] => 1 [name] => 名前 [sub_id] => Array ( [0] => 12 [1] => 13 ) [sub_name] => Array ( [0] => あああ [1] => いいい ) [sub_cnt] => Array ( [0] => 5 [1] => 5 ) ) [1] => Array ( [id] => 1 [name] => 名前 ) ) sub_***は配列が存在するものとしないものがあります。 そしてtpl側は {foreach item=items from=$str} <ul id="side{$items.id}"> {foreach item=item from=$items} <li><a href="index.php?id={$item.sub_id}">{$item.sub_name} ({$item.sub_cnt})</a></li> {/foreach} </ul> {/foreach} とforeachを重ねてみたのですがsub_***の値が表示されない 状態です。 複雑な配列なのですがこの場合どうすればうまく表示させれるの でしょうか?

    • ベストアンサー
    • PHP
  • Smarty ループ回数を 可変にしたい

    お世話になります。 以下のような多次元配列があり、以下のようなリストを表示させたいのですが。 $data = array( [0] => array( [date] =>'2008-04-13' [title] => array( [0] =>'aaaaaa' [1] =>'bbbbbb' [2] =>'cccccc' ) [id] => array( [0] => 23 [1] => 24 [2] => 25 ) ) [1] => array([date] =>'2008-03-03' [title] => array( [0] =>'ddddd' [1] =>'eeeee' [id] => array( [0] => 21 [1] => 22 ) ) ) $smarty->assign('data', $data); こんなリストにしたい。 2008-04-13 23---aaaaaa 24---bbbbbb 25---cccccc 2008-03-03 21---dddddd 22---eeeeee テンプレート側で下記のコーディングを試みましたが、だめでした。 {foreach from=$data item=value01 } <dt>{$value01.date}</dt> {foreach from=$value01 item=value02 } <dd>{$value02.id}---{$value02.title}</dd> {/foreach} {/foreach} 結果 2008-04-13 2 2008-03-03 2 となりました。 ネストしたループをそれぞれの id または title の要素数だけループさせるにはどうしたらよいでしょうか。 どなたかご教授の程、よろしくお願いします。

    • ベストアンサー
    • PHP
  • Smartyについて

    PHPとSmartyでカレンダーを製作しております。 カレンダーを以下の配列に格納し、テンプレートで表示しています。 $cal = Array([0] => Array([0] => [1] => [2] => [3] => 1 [4] => 2 [5] => 3 [6] => 4) [1] => Array([0] => 5 [1] => 6 [2] => 7 [3] => 8 [4] => 9 [5] => 10 [6] => 11) [2] => Array([0] => 12 [1] => 13 [2] => 14 [3] => 15 [4] => 16 [5] => 17 [6] => 18) [3] => Array([0] => 19 [1] => 20 [2] => 21 [3] => 22 [4] => 23 [5] => 24 [6] => 25) [4] => Array([0] => 26 [1] => 27 [2] => 28 [3] => 29 [4] => 30 [5] => 31 [6] => )) テンプレートは以下です。(一部のみ) {section name=index loop=$cal} <tr> <td> {$cal[index].0} </td> </tr> (以下省略) {section} これで、カレンダーは表示できていますが、これに付加して、 10日、15日、20日、30日の<td>のバックカラーを変えたいのです。 そこで、以下の配列をテンプレートに渡し、実現したいのですが 上記のテンプレートにどう組み込めばいいのかをご教授下さい。 $day = Array([0] => Array([0] => 10 ) [1] => Array([0] => 15 ) [2] => Array([0] => 20 ) [3] => Array([0] => 30 ))

    • ベストアンサー
    • PHP
  • MySQLのデータをPHPで多次元連想配列にしたい

    MySQLのデータを多次元連想配列にする方法を教えて下さい。 下記のような多次元連想配列のデータがあります。 これと同様のMySQLに登録されたデータから多次元連想配列を作りたいと思います。 $test= array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90"), ); print_r($test); ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- これと同様のデータをMySQLに作成します。 テーブル名:test 列名:id,kamoku,tensu MySQLからデータを取得 try { $dbh = new PDO($DSN , $DBUSER , $DBPASS); $query = select * from test $stmt = $dbh->prepare($query); $stmt->execute(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)) { $id = ($result['id']); $kamoku = ($result['kamoku']); $tensu = ($result['tensu']); } } catch(PDOException $e) { print "Error!: " . $e->getMessage() . "<br>"; die(); } このソースの中で何らかの処理をして print_r($test); を実行したときに ---print_r($test)の結果--------------------------------- Array ( [0] => Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) [1] => Array ( [id] => 2 [kamoku] => 理科 [tensu] => 88 ) [2] => Array ( [id] => 3 [kamoku] => 国語 [tensu] => 90 ) ) -------------------------------------------------------- というような、文頭で記載したものと同じ結果を得たいと思います。 while内で print_r($result);を行うと1行ずつ下記のような連想配列 Array ( [id] => 1 [kamoku] => 算数 [tensu] => 70 ) が取得できているのでこれを連結させて $test_sample=<<<EOF array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") EOF; という配列の中身は作ることができました。 (1)ケース1 $test=array($test_sample); print_r($test); としてもダメで、 Array ( [0] => array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90") ) というようにうまく多次元連想配列になっていません。 (2)ケース2 $test='array('.$test_sample.')'; print_r(test); としてみたところ、 array( array("id" => "1","kamoku" => "算数","tensu" => "70"), array("id" => "2","kamoku" => "理科","tensu" => "88"), array("id" => "3","kamoku" => "国語","tensu" => "90")) というように配列ではなく単なる文字列として表示されてしまいます。 配列の中身を変数で扱う時には特別な記述法などがあるのでしょうか?

    • ベストアンサー
    • PHP
  • SmartyのSectionの良い例ってないでしょうか?

    Smartyのマニュアルでは、テンプレート側の例しかなく、PHP側でどうすれば良いのかがわかりません。 一番良く使うと思われるDBから連想配列を取得し、 それをテンプレートで表示する例がインターネット上のどこにも書かれていないので(T_T) <? //Smartyってスマートでないかも・・ $ar[0][testCd] = "1"; $ar[0][testName] = "田中"; $ar[1][testCd] = "2"; $ar[1][testName] = "鈴木"; ?> 上記配列をSmartyのSectionタグを用いて、 以下のように表示するには、PHP、テンプレートで 夫々どう書けば良いのでしょうか? ■No1 田中 ■No2 鈴木

    • ベストアンサー
    • PHP
  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • smartyの配列について

    お世話になっております。 maru7406と申します。 今、phpとsmartyでかなり困っております。 お分かりの方がいましたら教えてください。 {section name=AAA loop=BBB} {assign var="idx" value=$smarty.section.AAA.index}  {section name=aaa loop=bbb}  {assign var="idy" value=$smarty.section.aaa.index}  {/section} {/section} で、ループ処理をしようと考えております。 loop=bbbの後ろに文字列として$idxを|cat:で連結し、 ループをまわしたいのですが、うまくいきません。 ちなみにappendしている部分は、 $z = 0; $x = substr($_stationInfo_list[0][line_cd],0,5);  for ($y=0; $x === $_stationInfo_list[$y][line_cd]; $y++)   {    $this->append("BBB".$z, $_stationInfo_list[$y]);   } $z = 1; while($z < count($_stationName)){  $x = substr($_stationInfo_list[$y][line_cd],0,5);   for ($y=$y; $x === $_stationInfo_list[$y][line_cd]; $y++)    {    $this->append("BBB".$z, $_stationInfo_list[$y]);    }    $z++;   } です。 loop=bbb0という配列が欲しいのですが。 ちなみに、 {bbb0|@debug_print_var}では望んでいる配列がアサインされているのを確認しています。 単純に、{section name=aaa loop=bbb|cat:$idx} では何がうまくいかないのでしょうか。 わかる方がおりましたらよろしくお願いいたします。

    • 締切済み
    • PHP
  • Smarty の演算方法

    Smartyで、配列の数×2+3という計算をさせたいのですが・・ ■配列の数だけを出力はOKでしたが、 rowspan="{$a[$id]|@count}"> ■配列の数x2+3という演算はできませんでした・・ rowspan="{$a[$id]|@count|*2+3}"> 一度に演算するのは無理でしょうか? Smartyに変数をセットする方法、 又は日本語マニュアルのありかでもOKです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 添え字が全て文字列のPHPの多次元配列をSmartyでループ表示したい。

    PHPで作成した多次元配列をSmartyでループして表示する方法について。(添え字が全て文字列の場合で、ループ回数を固定したい。) こんにちわ。 以下のような配列があるとします。 $abcde = array("sakana" => array("aaa" => "あじ","bbb" => "ひらめ"),"oyasai" => array("ggg" => "ふき","hhh" => "トマト"),"niku" => array("eee" => "ぶた","ooo" => "鳥")); echo "<pre>"; print_r($abcde); echo "</pre>"; この配列をSmartyに渡し、以下の条件でループして表示したいのですが、いい方法はありますでしょうか。 ・ループ回数は二回 ・一番最初の添え字(sakana、oyasai、niku)の値を使わずに表示したい。(自動的に上から順番に取り出してほしい) foreachだと全ての値が表示されてしまい、sectionだとうまく表示されませんでした。 ↓こんな感じで表示したいです。(ループ二回なので肉は表示せず) 魚 :あじ、ひらめ 野菜:ふき、トマト よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう