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.
相关产品推荐
相关产品推荐

