您好我有一个smarty变量,其值如(Number,Number,Number),我想替换中间部分:
所以基本上我想要第一个,最后一个数字用“ - ”组合,其余的应该被删除。我怎样才能聪明地实现这一目标?
提前致谢!
答案 0 :(得分:1)
Smarty是一个模板系统。它的主要目的是将从PHP代码(在变量中)接收的数据表示为HTML或任何其他文本格式。
进行转换的最简单方法就是在PHP代码中准备它们并将它们分配给变量。
另一方面,这种转变不是商业规则,而是展示细节;因此,它必须在视图(Smarty)中实现,而不是在模型(PHP代码)中实现。
Smarty的最佳解决方案是实现此转换的write a Smarty plugin(modifier)。
这是一个简单的例子,说明这样一个修饰符的样子:
/**
* Smarty modifier plugin
*
* @param string|array $range input string or array
* @param string $separator the value to use as separator (e.g. '...')
* @return string
*/
function smarty_modifier_range($range, $separator = '-')
{
// If the input is a string (like "1,2,3,4"), convert it to an array
if (is_string($range)) {
$range = explode(',', $range);
} elseif (! is_array($range)) {
// If it's neither string, nor array then
// this modifier has no effect on it
return $range;
}
// A range must have at least two components
if (count($range) < 2) {
// It's not a range
return implode(',', $range);
}
// Use only the first and the last item
return reset($range).$separator.end($range);
}
为了使用它,你必须告诉Smarty在哪里找到它。为这个插件创建一个目录(也许你会写更多Smarty插件)并将该函数放在这个目录中名为modifier.range.php
的文件中。
在Smarty对象初始化期间使用Smarty函数addPluginsDir()
将此目录添加到查找插件的目录列表中。
$smarty = new Smarty();
$smarty->addPluginsDir(array('... the path of the new director here'));
修饰符接受包含以逗号分隔的值的数组和字符串。它从中提取第一个和最后一个组件(如果至少有两个组件)并通过可配置的分隔符返回它们(默认值:-
):
$smarty->assign('var1', range(12, 16));
$smarty->assign('var2', array(7, 8, 9, 10, 11));
$smarty->assign('var3', '2,3,4,5,6');
$smarty->assign('var4', '4');
$smarty->assign('var5', array(5, 10, 15));
$smarty->assign('var6', array(3, 5, 6, 4));
在模板中:
{$var1|range} // 12-16 (modify array)
{$var2|range:".."} // 7..11 (use custom separator)
{$var3|range} // 2..5 (modify string)
{$var4|range} // 4 (there is no range here)
{$var5|range} // 5-15 (doesn't verify for gaps)
{$var6|range} // 3-4 (doesn't verify the order)
最后一个例子显示了插件的缺点,因为它暴露在上面。它不会验证输入数组或字符串中的值是否按升序排序。因此,如果它们尚未排序,则其输出不太正确。
但是,这是一个小问题,可以使用sort
PHP函数轻松解决。
更新:可以在Github找到更精细的插件版本。
答案 1 :(得分:-1)
您确定您的变量是字符串而不是数组吗?
对于数组:您可以使用foreach循环来处理所有数组元素,但只显示第一个和最后一个项目。 这正是您所需要的: http://www.smarty.net/forums/viewtopic.php?p=3219
但对于一个字符串,你可以在“,”上将其爆炸以获取数组或regex_replace修饰符: http://www.smarty.net/docsv2/en/language.modifier.regex.replace.tpl
答案 2 :(得分:-2)
List<String> splitedList = Arrays.asList(variable.split(","));
String finalString=splitedList.get(0)+"-"+splitedList.get(splitedList.size()-1);