Smartyで添え字が全て文字列の多次元配列を表示する方法

このQ&Aのポイント
  • Smartyを使用して添え字が全て文字列の多次元配列を表示する方法について解説します。
  • 元データの内容が頻繁に変わるため、PHP側で加工してテンプレートはループで回す方法をご紹介します。
  • ご質問の内容によれば、以下のようにPHPとSmartyを組み合わせることで目的を達成できます。
回答を見る
  • ベストアンサー

Smartyで添え字が全て文字列の多次元配列

Smartyで添え字が全て文字列の多次元配列 いつもお世話になっております。 Smartyで添え字が全て文字列の多次元配列を表示したいと考えています。 ■■元データ■■ $menu_list = array( '魚' => array( 'サバ' => 'サバカレー', 'タイ' => 'タイカレー' ), '肉' => array( '豚肉' => 'ポークカレー', '牛肉' => 'ビーフカレー' ), '野菜' => array( 'キャベツ' => 'キャベツカレー', 'きゅうり' => 'きゅうりカレー' ) ); ■■期待する出力■■ <ul> <li>魚 <li>サバ/サバカレー<li> <li>サバ/サバカレー<li> </li> </ul> <ul> <li>肉 <li>豚肉/ポークカレー<li> <li>牛肉/ビーフカレー<li> </li> </ul> <ul> <li>野菜 <li>キャベツ/キャベツカレー<li> <li>きゅうり/きゅうりカレー<li> </li> </ul> 散々悩んだ挙句、Smarty側では当初次のようにしたところ、とりあえずはうまくいっています。 {foreach from=$menu_list key="key" item="item" name="loopName"} {if $smarty.foreach.loopName.iteration <= 3} {if $smarty.foreach.loopName.iteration == 1} <ul> <li>魚 {elseif $smarty.foreach.loopName.iteration == 2} <ul> <li>肉 {elseif $smarty.foreach.loopName.iteration == 3} <ul> <li>野菜 {/if} {foreach from=$menu_list.$key key="key" item="val"} <li>{$key}/{$val}</li> {/foreach} {/if} </li> </ul> {/foreach} 元データの内容は頻繁に変わるため、Smartyのテンプレートに添え字を直で書くのは 避けたいのですが、どうしたら良いのでしょうか。 できるだけPHP側で加工して、テンプレートはループで回すだけにしたいと考えています。 すみませんが、お知恵を貸していただけないでしょうか。 ・・・カレー食べたい。

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

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

  • ベストアンサー
  • kuzumiHK
  • ベストアンサー率72% (132/183)
回答No.1

smartyをあまり使ったことがないので、 予測のレベルですが、こんな感じでいかがでしょうか。 {foreach from=$menu_list key="key1" item="item1" name="loop1"} <ul> <li>{$key1} <ul> {foreach from=$item1 key="key2" item="val2" name="loop2"} <li>{$key2}/{$val2}</li> {/foreach} </ul> </li> </ul> {/foreach} テンプレとスクリプトの分離をしない場合だと以下のような感じになるため。 <?php $menu_list = array( '魚' => array( 'サバ' => 'サバカレー', 'タイ' => 'タイカレー' ), '肉' => array( '豚肉' => 'ポークカレー', '牛肉' => 'ビーフカレー' ), '野菜' => array( 'キャベツ' => 'キャベツカレー', 'きゅうり' => 'きゅうりカレー' ) ); $all=""; foreach( $menu_list as $key1 => $val1 ){ // 1次元のループ $all = $all . "<ul>\n<li>" . $key1 . "\n<ul>\n"; foreach( $val1 as $key2 => $val2 ){ // 2次元のループ $all = $all . "<li>" . $key2. "/" . $val2 . "</li>\n"; } $all = $all . "</ul>\n</li>\n</ul>\n"; } print "$all"; ?>

yasagure-kun
質問者

お礼

いただきましたサンプルで、無事動作しました。 普通にPHPでforeachするように考えればいいんですね。 ありがとうございました。

yasagure-kun
質問者

補足

激しくどうでもいい追記。 最近、この手のちょっと考えればわかりそうな質問を連発してました。 皆様ごめんなさい。 海よりも深く反省。

その他の回答 (1)

  • kuzumiHK
  • ベストアンサー率72% (132/183)
回答No.2

まったく問題なす。…という無駄な回答のほうが問題があったりして。。

yasagure-kun
質問者

お礼

ベストアンサーわっすれってたー。 コメありがとうございまする。

関連するQ&A

  • 添え字が全て文字列の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
  • 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の方法がわかりません。 どなたかご教授の程、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Smartyで多次元配列をスマートに出力するには?

    Smartyで多次元配列をスマートに出力するには? ■php側 $array1[1] = 'ショッピング案内'; $array1[2] = 'サイト案内'; $array1[3] = 'お問い合わせ'; $array2[1][1] = '0101'; $array2[1][2] = '0102'; $array2[1][3] = '0103'; $array2[1][4] = '0104'; $array2[1][5] = '0105'; $array2[2][1] = '0201'; $array2[2][2] = '0202'; $array2[2][3] = '0203'; $array2[2][4] = '0204'; $array2[2][5] = '0205'; $array2[2][6] = '0206'; $array2[2][7] = '0207'; $array2[3][1] = '0301'; $array2[3][2] = '0302'; $array2[3][3] = '0303'; $array2[3][4] = '0304'; $array3[1][1] = 'お買い物の流れ'; $array3[1][2] = 'お支払いについて'; $array3[1][3] = '配送について'; $array3[1][4] = '返品・交換について'; $array3[1][5] = 'メールマガジンについて'; $array3[2][1] = 'サイトマップ'; $array3[2][2] = 'このサイトについて'; $array3[2][3] = '販売者概要'; $array3[2][4] = '特定商取引法表記'; $array3[2][5] = 'プライバシーポリシー'; $array3[2][6] = '免責事項'; $array3[2][7] = 'リンクについて'; $array3[3][1] = 'FAQ(よくある質問)'; $array3[3][2] = 'お買い物について質問'; $array3[3][3] = '個別商品について質問'; $array3[3][4] = 'お問合せ対応時間'; $sub_menu = array($array1, $array2, $array3 ); $smarty->assign('SUB_MENU', $sub_menu); ■テンプレート側のサンプル <dl class="side_column"> <dt class="block_title">{$SUB_MENU[0][1]}</dt> <dd class="block_contents"> <ul class="sub_menu"> <li><a href="index.php?contents={$SUB_MENU[1][1][1]}">{$SUB_MENU[2][1][1]}</a></li> <li><a href="index.php?contents={$SUB_MENU[1][1][2]}">{$SUB_MENU[2][1][2]}</a></li> <li><a href="index.php?contents={$SUB_MENU[1][1][3]}">{$SUB_MENU[2][1][3]}</a></li> <li><a href="index.php?contents={$SUB_MENU[1][1][4]}">{$SUB_MENU[2][1][4]}</a></li> <li><a href="index.php?contents={$SUB_MENU[1][1][5]}">{$SUB_MENU[2][1][5]}</a></li> </ul> </dd> </dl> テンプレート側の繰り返し処理の仕方をご教示くださいませ。 もっと効率よくスマートに実現できる方法がありましたらそちらもよろしくお願いします。 どうぞよろしくお願いします。

    • 締切済み
    • PHP
  • Smartyの自作プラグインで配列を扱えません

    Smartyで、配列であった場合に、implodeで結合させるプラグインを作りたいのですが、思うように動作しません。 テンプレート内で、次のように記述しています。 {foreach from=$value item=i}  {$i->note|ketugou} {/foreach} ketugouプラグインでは次の通りです。 function smarty_modifier_ketugou($key){ if (is_array($key)) { return implode(', ', $key); } else { return $key; } } 上記の場合、表示されるのは'Array'のみです。 プラグインで配列かどうかを確認せずに実行すると、次のエラーが出ます。 Warning: implode() [function.implode]: Bad arguments. in。。。 テンプレート上では配列であったのが、プラグインに渡すと配列ではなく、stringとなっていて要素数分実行されています。プラグインからのエラーは配列じゃないからなのですが、どう対処すればいいのでしょうか。

    • ベストアンサー
    • PHP
  • ある文字を含む文字列のみ配列にする

    何度もすみません。 array(XX) { [0]=> array(2) { ["text"]=> string(YY) "りんご美味しい" ["name"]=> string(Z) "あいこ" } [1]=> array(2) { ["text"]=> string(XX) "富士山登りたい" ["name"]=> string(Z) "みほ" } [2]=> array(2) { ["text"]=> string(XX) "動物園行きたい" ["name"]=> string(Z) "なほ" } [3]=> array(2) { ["text"]=> string(XX) "メロン美味しい" ["name"]=> string(Z) "ゆい" } [4]=> array(2) { ["text"]=> string(XX) "お腹すいた" ["name"]=> string(Z) "まこ" } [5]=> array(2) { ["text"]=> string(XX) "数学やだー" ["name"]=> string(Z) "あいこ" } ……… } のような配列$textがあり、そこから["text"]に $keyword = array("りんご","メロン") の文字列を含むものだけ取り出したいです。 今までもらった回答を参考に $key_text = array(); foreach($text as $key => $v1){ foreach($keyword as $v2){ if(strpos($v1[text], $v2) !== false){ $key_text[] = $key; } } } と書いてみたのですが、上手く動作しません。 よろしければどこが間違っているかご指摘ください。 お願いします。

    • ベストアンサー
    • PHP
  • ある文字を含む文字列のみ配列にする方法

    var_dump($text); を行うと array(1) { [0]=> string(XX) "あいさつ" } array(1) { [0]=> string(XX) "いい日旅立ち" } array(1) { [0]=> string(XX) "りんご、うまい" } array(1) { [0]=> string(XX) "メロン好き" } …… となるような変数 $text があり、そこから $key = array("ばなな","りんご","メロン"); の配列内にある文字列を含むものだけを新たに格納したいです。 自分では foreach($text as $value){ if(in_array($value, $key)){ $key_text[] = $value; } } と書いて試したのですが、NULLと返ってきてしまいます。 どうやって書けばいいか教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Perlで配列の添え字を抽出したい

    Perl初心者で、既出の質問かもしれませんが、ご教授願います。 以下のように"*"が入っている値を抽出する処理があります。 ーーーーーー処理ーーーーーー @array = ('aaa', 'b*b', 'ccc', 'dd*'); foreach (@array) { if ($_ =~/\*/) { print "OK\n"; } else { print "NG\n"; } } ーーーーーーーーーーーーーーーー ーーー結果ーーー NG OK NG OK ーーーーーーーー <質問> 上記結果より、OKとなった値の配列(添え字)を取得するにはどのようにすれば宜しいでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 2次元配列をスマーティーにうけわたしたい。

    2次元配列を下記のようなソースで処理し、GETで取得したパラメーターと同じならば、スマーティーをつかって、検索フォームに値をわたしたい(次のページにいった時にフォームのチェックボタンなどをチェックしたいとかんがえています。(foreachはつかわないで)単体と複合の配列は、ラジオボタン、一戸建てと大規模のほうはチェックボックスにしたいと考えてます。 現在は、値が表示されない状態です。どうしたらよいでしょうか? //------------検索画面にひとつのパラメーターをわたす機能 $flagbreak=0; foreach($arr_parame as $row){ $i=1; foreach($row as $id => $list){ if( $id2 == $list['url'] ){ //$id2はGETで取得した値 $check_flag = $list['url']; $parame[$id][$check_flag] = '変数に渡す値を記入'; $flagbreak=1; break; } } if($flagbreak == 1)break; } $smarty -> assign("paramelist" , $parame); //smartyのしょり tplでは、{$paramelist.id.url}と書いてます。 ///////////////////////////////////////////////////////// 2次元配列 $arr_parame = array( array( array('no' => 1 , 'url' => 'un', 'title' => '単体'), array('no' => 2 , 'url' => 'com', 'title' => '複合')), array( array('no' => 1 , 'url' => 'ko', 'title' => '一戸建て'), array('no' => 2 , 'url' => 'man', 'title' => '大規模住宅'));

    • 締切済み
    • PHP
  • smartでのtable表示について

    ちょっとベタな書き方ですが下記のように、画像と名前のセットを表示して行く時に、 最後、余ったセルに{html_table}などを使って自動的に埋めて行く事は、出来ますでしょうか、 <table width="650" border="0" cellspacing="0" cellpadding="0"> {foreach from=$data item=data key=key name="loop"} {if $smarty.foreach.loop.iteration %5 ==1}<tr>{/if} <td> <table width="125" border="0" cellspacing="0" cellpadding="1"> <tr> <td><a href="{$data.id}.php"><img src="img/{$data.staff_file}" width="125" height="175" border="0"></a> </td></tr> <tr> <td>{$data.name} </td> </td></tr> </table> </td> {if $smarty.foreach.loop.iteration % 5 ==0}</tr>{/if} {/foreach} {if $smarty.foreach.loop.total % 5 ==4}<td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==3}<td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==2}<td> </td><td> </td><td> </td>{/if} {if $smarty.foreach.loop.total % 5 ==1}<td> </td><td> </td><td> </td><td> </td>{/if} </table>

    • ベストアンサー
    • 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

専門家に質問してみよう