smarty に関する質問です。foreach をまわすときに、0 だったら foreach そのものを表示しないようにしたいのですが、簡単にする方法はあるでしょうか? 連想配列が0だったら、ださないというのが簡単に記述できるとありがたいです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2010/03/12 19:02:45
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:GreenStar No.2

回答回数192ベストアンサー獲得回数46

ポイント69pt

{if} で囲んでしまえば良いのでは?

http://www.smarty.net/manual/ja/language.function.if.php

{if is_array($foo) && count($foo) > 0)

{* foreach ループを実行します *}

{/if}

その他の回答3件)

id:horonict No.1

回答回数257ベストアンサー獲得回数51

ポイント1pt

それはsmartyではなくPHPそのものに対する質問ではありませんか?

でしたら、連想配列に要素が1つもなければ、foreachは一度も回りませんよ。


foreachとは

http://php.net/manual/ja/control-structures.foreach.php

id:kaiketsu

smarty に foreach あります。

2010/03/08 16:55:20
id:GreenStar No.2

回答回数192ベストアンサー獲得回数46ここでベストアンサー

ポイント69pt

{if} で囲んでしまえば良いのでは?

http://www.smarty.net/manual/ja/language.function.if.php

{if is_array($foo) && count($foo) > 0)

{* foreach ループを実行します *}

{/if}

id:rouge_2008 No.3

回答回数595ベストアンサー獲得回数351

ポイント10pt

『foreach をまわすときに、0 だったら』、『連想配列が0だったら』というのは、どういう意味でしょうか?

配列が存在しなかったらという意味でしょうか?

その場合は、以下のように記述するだけで大丈夫です。(※通常の配列か連想配列かは関係ありません。)

$smarty->assign('color_list',array());

値をセットしておいて、後で切り替えたい場合は以下のようにするといいです。

配列は通常通り記述します。

$smarty->assign('color_list',array('white'=>array('name'=>'白','code'=>'#ffffff'),'red'=>array('name'=>'赤','code'=>'#ff0000'),'blue'=>array('name'=>'青','code'=>'#0000ff'),'green'=>array('name'=>'緑','code'=>'#008000'),'yellow'=>array('name'=>'黄色','code'=>'#ffff00')));

テンプレート側に以下のように記述します。

<h3>foreachのテスト - part.1</h3>
<ul>
{foreach from=$color_list key=colorName item=color name=clist}
{if $smarty.foreach.clist.show == $show}
<li>{$colorName}: 色 - {$color.name} カラーコード - {$color.code}</li>
{/if}
{/foreach}
</ul>

表示・非表示は変数「$show」で切り替える事が可能ですので、ページごとになど条件に応じて以下のように変数をセットします。

$smarty->assign('show', true);

あるいは

$smarty->assign('show', false);

※「1」または「0」でも可能です。

上記の例だと、非表示を指定しても見出しや(ソースに<ul>)が表示されてしまいますので、次のように「.first」プロパティや「.last」プロパティで表示を切り替えるとするとすっきりします。

{foreach from=$color_list key=colorName item=color name=clist}
{if $smarty.foreach.clist.show == $show}
{if $smarty.foreach.clist.first}
<h3>foreachのテスト - part.2</h3>
<ul>
<li>{$colorName}: 色 - {$color.name} カラーコード - {$color.code}</li>
{else}
<li>{$colorName}: 色 - {$color.name} カラーコード - {$color.code}</li>
{/if}
{if $smarty.foreach.clist.last}
</ul>{/if}
{/if}
{/foreach}

※見出しと<ul>を最初の場合だけ、ulの閉じタグを最後の場合に記述するようにしています。

このようにすると、{foreach}の中に入れても繰り返し表示されません。


http://www.smarty.net/manual/ja/language.function.foreach.php

http://www.smarty.net/manual/ja/language.function.section.php

id:snufkinski No.4

回答回数41ベストアンサー獲得回数11

ポイント10pt

私の場合は、下記のように{foreach}文を{if}文で囲います。ご参考まで。

{if $num > 0}
	{foreach from=$array item=i name="loop"}
		<p>{$i.xxx}</p>
	{/foreach}
{else}
	<p>検索結果は、0件です</p>
{/if}

http://www.smarty.net/manual/ja/language.function.if.php: if|組み込み関数|Smarty マニュアル]

  • id:bayan
    http://www.smarty.net/manual/ja/language.function.if.php

    「|| や or、 &&、and、 is_array() など、PHP の条件演算子や関数はすべて利用可能です。 」

    {if} で is_array や count がまんまつかえたんですね。。。

    知らなくって、


    {if ($foo|@count) gt 0}
    <table>
    <tr><th>名前</th></tr>
    {foreach from=$foo item=item}
    <tr><td>{$item.name}</td></tr>
    {/foreach}
    </table>
    {/if}


    てな感じで書いてました。
  • id:GreenStar
    id:bayan さんのように具体的なコード書いたほうがよかったかもしれない! と、不親切な自分に気づいた!!
    コメントに星はつけられないのか?!

    あっ?! id:horonict さん、理由は知らないけど強制退会になったみたい! 勘違い回答が理由とはとうてい思えないが、ポイント配分されたらどうなるんだろ?? ぼっシュート??
    http://hatena.g.hatena.ne.jp/bbs/9/237
    http://www.hatena.ne.jp/horonict/
  • id:rouge_2008
    回答を一部訂正します。
    『表示・非表示は変数「$show」で切り替える事が可能ですので、~』と書きましたが、『この例では、表示・非表示を変数「$show」で切り替えるようにしましたので、~』に変更します。


    それから、連想配列が0の場合に表示しないとは、例えば私の回答の例に出した配列で言えば、「{$color_list.white}(phpでは$color_list['white'])」があれば表示、なければ表示しないというような事でしょうか?
    その場合は以下のようにします。

    {if isset($color_list.white)}
    <h3>foreachのテスト - part.3</h3>
    <ul>
    {foreach from=$color_list.white key=colorKey item=color}
    <li>{$colorKey}: {$color}</li>
    {/foreach}
    </ul>
    {/if}

    {if isset($color_list.pink)}
    <h3>foreachのテスト - part.4</h3>
    <ul>
    {foreach from=$color_list.pink key=colorKey item=color}
    <li>{$colorKey}: {$color}</li>
    {/foreach}
    </ul>
    {/if}


    ※上記の例では、「{$color_list.white}」はあるので上は表示しますが、「{$color_list.pink}」はないので下は表示しません。

    ・変数
    http://www.smarty.net/manual/ja/language.syntax.variables.php

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません