プロが教えるわが家の防犯対策術!

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だとうまく表示されませんでした。

↓こんな感じで表示したいです。(ループ二回なので肉は表示せず)
魚 :あじ、ひらめ
野菜:ふき、トマト

よろしくお願いします。

A 回答 (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}

という方法もありますが、いかがでしょう?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/03/19 10:05

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}

この回答への補足

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

補足日時:2008/03/11 15:05
    • good
    • 0

$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}

コメントも無くて無理やりな感じですが、
一応出来そうという感じです^^;
    • good
    • 0

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";
  }

私の環境で試した限りでは

  魚:あじ,ひらめ
  野菜:ふき,トマト

という表示にはなりました。

この回答への補足

回答ありがとうございます!
Smartyではうまくループ処理が出来ず、
とりあえずPHP側でforeachを使って処理しているのですが、
PHPではなく、Smarty上でループ処理をしたかったんです。
書き方が悪くてごめんなさい。

PHPで作った配列の変数をSmartyに渡し、
Smarty上で上位二つを表示、且つ添え字が文字列なんです。
もしお時間ありましたら再度コメントお願いします!

補足日時:2008/03/11 04:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!