在 Smarty 模板中對陣列呼叫 count、end 等 PHP 內建函數時,直接寫 {$arr|count} 會輸出字串 Array 而非長度。正確做法是加上 @ 符號:{$arr|@count}。
count($arr)。count() 接受陣列參數,若直接傳入陣列變數,PHP 會將陣列轉為字串 "Array" 再計算長度(結果為 1)。@ 告訴 Smarty 將變數作為參數陣列展開:count(...$arr) 相當於 count($arr) 正確呼叫。| 函數類型 | 是否需 @ | 範例 |
|---|---|---|
| 陣列操作函數(count, end, reset, key, current, array_sum 等) | 必須加 @ | {$arr|@count}, {$arr|@end} |
| 字串函數(strlen, strtoupper, substr, md5 等) | 可加可不加 | {$str|strlen} = {$str|@strlen} |
| 其他標量函數 | 通常不需 @ |
<?php
$smarty->assign('items', ['apple', 'banana', 'orange']);
$smarty->assign('title', 'Hello World');
?>
{* 陣列長度 *}
總共 {$items|@count} 種水果<br>
{* 取得最後一個元素 *}
最後是:{$items|@end}<br>
{* 字串長度(不需 @) *}
標題長度:{$title|strlen} 字元<br>
{* 多重修飾符 *}
大寫並截取:{$title|upper|truncate:5}<br>
Smarty 允許註冊自訂修飾符或直接在模板中呼叫 PHP 函數(需開啟 $smarty->security_policy->php_modifiers)。
<?php
function my_format($str, $prefix = '[', $suffix = ']') {
return $prefix . $str . $suffix;
}
// 註冊為修飾符
$smarty->registerPlugin('modifier', 'my_format', 'my_format');
?>
{$title|my_format:'<':'>'} {* 輸出 <Hello World> *}
@count,可考慮封裝為專用修飾符 count_arr 統一管理。