如何在Smarty模板中区分数组的整数与字符串并设置不同链接
区分Smarty数组中的整数与字符串值并设置不同链接
嘿,你已经完成了从数据库获取$com_likes数组并传递给Smarty模板的基础工作,接下来咱们就解决在模板里区分数值和字符串、设置不同链接的问题。这里有几种实用的方案:
直接在Smarty模板里判断类型(最便捷)
你的section循环已经搭好了,只需要在循环内部对每个字段值做类型检测就行。Smarty自带is_numeric修饰符,能轻松识别数字或数字格式的字符串(毕竟从数据库读出来的INT字段有时候会被转成字符串)。
假设你要处理的字段是like_id(换成你实际的字段名就行),代码可以这么写:
{section name=b loop=$com_likes} {* 先把当前字段值存到临时变量里,方便后续使用 *} {assign var="current_val" value=$com_likes[b].like_id} {* 判断是否为数值类型 *} {if $current_val|is_numeric} <!-- 整数/数值专属链接 --> <a href="numeric_detail.php?id={$current_val}">{$current_val}</a> {else} <!-- 字符串专属链接,记得用urlencode转义参数 --> <a href="string_detail.php?content={$current_val|urlencode}">{$current_val}</a> {/if} {/section}
如果你需要严格区分原生整数类型(不是数字字符串),可以直接调用PHP的gettype函数来判断:
{if gettype($current_val) == 'integer'} <!-- 只有原生整数才走这个分支 --> <a href="strict_integer_link.php?id={$current_val}">{$current_val}</a> {else} <a href="string_link.php?content={$current_val|urlencode}">{$current_val}</a> {/if}
不过要注意:从数据库用mysqli_fetch_array默认返回的数值可能是字符串类型,这种情况下gettype会返回string,所以用is_numeric通常更贴合实际场景。
提前在PHP端标记类型(可选,更清晰)
如果你想让模板逻辑更简单,也可以在PHP拉取数据的时候,给每个字段加上类型标记:
$qry9="SELECT * FROM company_likes WHERE post_id='$pid'"; $result9=mysqli_query($bd, $qry9); $com_likes= array(); while($row9 = mysqli_fetch_assoc($result9)){ // 用fetch_assoc只拿关联数组,更干净 // 给每个字段添加类型标记,比如给like_id加like_id_is_int $row9['like_id_is_int'] = is_int($row9['like_id']); $com_likes[] = $row9; }
然后在模板里直接用这个标记判断,不用再做类型检测:
{section name=b loop=$com_likes} {if $com_likes[b].like_id_is_int} <a href="numeric_link.php?id={$com_likes[b].like_id}">{$com_likes[b].like_id}</a> {else} <a href="string_link.php?content={$com_likes[b].like_id|urlencode}">{$com_likes[b].like_id}</a> {/if} {/section}
小提醒
- 记得把代码里的
like_id替换成你实际要处理的字段名,比如user_id、content之类的。 - 字符串作为URL参数时,一定要用
urlencode修饰符转义,避免出现特殊字符导致链接失效。 - 建议用
mysqli_fetch_assoc代替mysqli_fetch_array,只获取关联数组,减少不必要的索引数组元素,让代码更清晰。
内容的提问来源于stack exchange,提问作者kuldeep
相关产品推荐
相关产品推荐

