2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Smartyの@keyの機能

Last updated at Posted at 2016-06-13

Smartyで{$配列名|@key}のような記述に出くわしたので、その機能を記しておきます。

バージョン

php 5.6.15
Smarty 3.1.28

Smartyの修飾子

ここでの@keyは、$配列名(主に連想配列)内の、その時点で内部ポインタが指し示している要素のキー名を返します。

Smartyでは、変数と|(パイプ、縦線、縦棒)の右側に書かれている文言を修飾子と言い、Smartyで標準で用意されているライブラリ関数や、php関数を修飾子として適用できるのでした。

また@(アットマーク)を用いることで、要素一つ一つではなく配列全体に修飾子を作用させることができます。
(参考:http://www.smarty.net/docsv2/ja/language.modifiers.tpl)

たとえば、phpファイル側で

hello.php
<?php

$smarty->assign("$fruit", array("apple" => "リンゴ", "orange" => "ミカン", "grape" => "ブドウ");
$smarty->display('hello.tpl');

?>

のように連想配列がSmarty側に渡されたとき、

hello.tpl
{$fruit|@key}<br>
{while $fruit|@next}
  {$fruit|@key}<br>
{/while}

とすると、画面に以下のようにキー名が出力されます。

apple
orange
grape

phpのkey関数:http://php.net/manual/ja/function.key.php
phpのnext関数:http://php.net/manual/ja/function.next.php

ちなみに、foreach文内で修飾子keyを適用しても、foreachの中で複製した新たな配列をループさせているので、

hello.tpl
{foreach from=$fruit item=item}
  {$fruit|@key}<br>
{/foreach}

上のように$fruitkeyを作用させても同じ値が返ってきます。

apple
apple
apple

おまけ

配列の修飾子の前に付ける@ですが、今のバージョンでは@を付けなくても配列全体に作用するようです。

hello.tpl
{$fruit|@count}<br>
{$fruit|count}<br>

いずれも要素数3が返ってきます。

3
3

ただ、あくまで配列に作用させたいということを明示するためにも、@は付けたほうが良さそうですね。

過去のバージョンでの表示結果については以下を参照。
http://www.phppro.jp/phptips/archives/vol26/1

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?