You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Smarty模板中统计数组非空元素总数的方法求助

统计Smarty嵌套数组中非空元素总数的解决方案

问题分析

你当前使用的{$common_data.$tor_name|@count}仅能统计对应层级数组的元素个数,而非实际非空元素的数量,因此会多次输出1。要得到正确的非空元素总数,需要逐层遍历嵌套数组并判断值是否有效。


方案一:Smarty模板内直接统计

初始化计数器,逐层遍历数组的年份、月份、商品字段,判断值非空则累加计数:

{* 初始化计数器 *}
{assign var="non_empty_count" value=0}

{* 遍历顶层数据数组 *}
{foreach from=$data item=country_data}
    {* 遍历年份(跳过country字段)*}
    {foreach from=$country_data item=year_data key=year}
        {if $year neq 'country'}
            {* 遍历1-12月数据 *}
            {foreach from=$year_data item=month_data}
                {* 遍历每个月份的商品字段 *}
                {foreach from=$month_data item=value}
                    {* 判断值非空且非NULL *}
                    {if $value neq '' && $value neq null}
                        {assign var="non_empty_count" value=$non_empty_count+1}
                    {/if}
                {/foreach}
            {/foreach}
        {/if}
    {/foreach}
{/foreach}

{* 输出最终结果 *}
总非空元素数:{$non_empty_count}

方案二:PHP后台预处理(推荐)

复杂统计逻辑放在后台处理更高效易维护,模板仅负责展示结果:

PHP后台代码

function countNonEmptyValues($array) {
    $count = 0;
    foreach ($array as $value) {
        if (is_array($value)) {
            // 递归处理嵌套数组
            $count += countNonEmptyValues($value);
        } else {
            // 过滤空值与NULL
            if ($value !== '' && $value !== null) {
                $count++;
            }
        }
    }
    return $count;
}

// 假设原始数据为$originalData
$nonEmptyCount = countNonEmptyValues($originalData);
// 将统计结果传给Smarty模板
$smarty->assign('non_empty_count', $nonEmptyCount);

Smarty模板调用

总非空元素数:{$non_empty_count}

针对现有foreach代码的修正

如果要基于你当前的遍历逻辑调整,可在内部嵌套遍历并判断:

{assign var="total" value=0}
{foreach from=$names_array item=tor_name name=foo2}
    {foreach from=$common_data.$tor_name item=year_data}
        {if is_array($year_data)}
            {foreach from=$year_data item=month_data}
                {foreach from=$month_data item=val}
                    {if $val neq '' && $val neq null}
                        {assign var="total" value=$total+1}
                    {/if}
                {/foreach}
            {/foreach}
        {/if}
    {/foreach}
{/foreach}
总非空元素数:{$total}

内容的提问来源于stack exchange,提问作者S.I.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:54:25