人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: kaiketsu
●カテゴリ:インターネット ウェブ制作
✍キーワード:Smarty 記述 連想配列
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● horonict
●1ポイント

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

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


foreachとは

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

◎質問者からの返答

smarty に foreach あります。


2 ● GreenStar
●69ポイント ベストアンサー

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

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

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

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

{/if}


3 ● rouge_2008
●10ポイント

『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


4 ● Snufkinski
●10ポイント

私の場合は、下記のように{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 マニュアル]

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ