• ベストアンサー

添え字が全て文字列の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だとうまく表示されませんでした。 ↓こんな感じで表示したいです。(ループ二回なので肉は表示せず) 魚 :あじ、ひらめ 野菜:ふき、トマト よろしくお願いします。

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

  • ベストアンサー
  • teala
  • ベストアンサー率42% (6/14)
回答No.4

No3です >私が実現したいのは、添え字(ここでいうsakanaやoyasai)を使わずに回数を二回ループしたいんです。 出来ればSmartyで回したいのですが、難しいでしょうか・・。 念のため確認したいのですが、 「魚:」「野菜:」という部分は必要なのでしょうか? 必要ないのであれば以下のように添え字なしでも処理ができます。 {foreach from=$abcde key="key" item="item" name="loopName"}  {if $smarty.foreach.loopName.iteration <= 2}    {foreach from=$abcde.$key key="key" item="item2"}     {$item2}    {/foreach}  {/if}  <br> {/foreach} また、別の方法として回数が1回目だったら魚と表示するのでしたら、 {foreach from=$abcde key="key" item="item" name="loopName"}  {if $smarty.foreach.loopName.iteration <= 2}    {if $smarty.foreach.loopName.iteration == 1}     魚:    {elseif $smarty.foreach.loopName.iteration == 2}     野菜:    {/if}    {foreach from=$abcde.$key key="key" item="item2"}     {$item2}    {/foreach}  {/if}  <br> {/foreach} という方法もありますが、いかがでしょう?

rakuda2525
質問者

お礼

ありがとうございます!参考にさせていただきます!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • teala
  • ベストアンサー率42% (6/14)
回答No.3

No2です。 すいません。勘違いしておりました>< 回数での条件ということですので、以下のほうが良いですね。 {foreach from=$abcde key="key" item="item" name="loopName"}  {if $smarty.foreach.loopName.iteration <= 2}    {if $key == 'sakana'}     魚:    {elseif $key == 'oyasai'}     野菜:    {/if}    {foreach from=$abcde.$key key="key" item="item2"}     {$item2}    {/foreach}  {/if}  <br> {/foreach}

rakuda2525
質問者

補足

回答ありがとうございます。 私が実現したいのは、添え字(ここでいうsakanaやoyasai)を使わずに回数を二回ループしたいんです。 出来ればSmartyで回したいのですが、難しいでしょうか・・。

すると、全ての回答が全文表示されます。
  • teala
  • ベストアンサー率42% (6/14)
回答No.2

$smarty->assign('abcde', $abcde); //この名前でSmartyに渡したとして ?> {*--- ここからSmartyのプログラム ---*} {foreach from=$abcde key="key" item="item"} {if $key == 'sakana'} 魚: {elseif $key == 'oyasai'} 野菜: {/if} {if $key != 'niku'} {foreach from=$abcde.$key key="key" item="item2"} {$item2} {/foreach} {/if} <br> {/foreach} コメントも無くて無理やりな感じですが、 一応出来そうという感じです^^;

すると、全ての回答が全文表示されます。
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

foreachの中でカウンタをカウントアップして、所定の回数(2回)になったらbreakすればいいのでは?   $i = 0;   foreach ($abcde as $key=>$category) {     if ($i++ >= 2) { break; }  // 2つ終わっていたらLoopを抜ける     switch($key) {  // 添え字を使わずに「魚」などを表示となると、こういうこと?     case 'sakana':       print '魚:';       break;     case 'oyasai':       print '野菜:';       break;     case 'niku':       print '肉:';       break;     }     $j = 0;     foreach ($category as $item) {       if ($j++ != 0) { print ','; } // 初回以外はカンマを前置する       print $item;     }     print "<br />\n";   } 私の環境で試した限りでは   魚:あじ,ひらめ   野菜:ふき,トマト という表示にはなりました。

rakuda2525
質問者

補足

回答ありがとうございます! Smartyではうまくループ処理が出来ず、 とりあえずPHP側でforeachを使って処理しているのですが、 PHPではなく、Smarty上でループ処理をしたかったんです。 書き方が悪くてごめんなさい。 PHPで作った配列の変数をSmartyに渡し、 Smarty上で上位二つを表示、且つ添え字が文字列なんです。 もしお時間ありましたら再度コメントお願いします!

すると、全ての回答が全文表示されます。

関連するQ&A