下面我将从基础到高级,详细讲解如何在 PHPCMS 模板中遍历数组。

(图片来源网络,侵删)
前提条件:PHP 后端如何传递数据到模板?
在讲解模板语法之前,必须明白一点:模板本身不能凭空创建数组,它必须由 PHP 控制器(如 phpcms/modules/模块名/模块名.php)中的代码将数据传递过来。
最常见的传递方式是使用 $this->assign() 方法。
PHP 控制器示例 (index.php):
<?php
defined('IN_PHPCMS') or exit('No permission resources.');
// 引入模型类
pc_base::load_app_class('model', '模块名', 0);
class index {
public function init() {
// 1. 准备要传递给模板的数据
$title = '文章列表';
// 2. 准备一个一维数组
$user_info = [
'name' => '张三',
'age' => 25,
'email'=> 'zhangsan@example.com'
];
// 3. 准备一个二维数组(最常用,如文章列表、产品列表等)
$article_list = [
[
'id' => 1,
'title' => 'PHPCMS 入门教程(一)',
'author' => '李四',
'click' => 100,
'addtime' => '2025-10-26 10:00:00'
],
[
'id' => 2,
'title' => 'PHPCMS 模板开发详解',
'author' => '王五',
'click' => 250,
'addtime' => '2025-10-27 15:30:00'
],
[
'id' => 3,
'title' => 'PHPCSS 数据库操作技巧',
'author' => '赵六',
'click' => 80,
'addtime' => '2025-10-28 09:15:00'
]
];
// 4. 使用 assign() 方法将变量传递给模板
// 参数一:模板中使用的变量名
// 参数二:PHP 中的变量
$this->assign('title', $title);
$this->assign('user', $user_info);
$this->assign('articles', $article_list);
// 5. 指定并显示模板文件
$this->display('index.html');
}
}
?>
模板中遍历数组的方法
我们有了从 PHP 传递过来的 $title, $user, 和 $articles 变量,就可以在模板文件 index.html 中进行遍历了。

(图片来源网络,侵删)
遍历一维数组 (foreach)
foreach 是最常用的遍历方式。
模板代码 (index.html):
<h1>{$title}</h1>
<h2>用户信息(遍历一维数组)</h2>
<ul>
{foreach $user as $key => $value}
<li>
<strong>{$key}:</strong> {$value}
</li>
{/foreach}
</ul>
输出结果:
<h1>文章列表</h1>
<h2>用户信息(遍历一维数组)</h2>
<ul>
<li><strong>name:</strong> 张三</li>
<li><strong>age:</strong> 25</li>
<li><strong>email:</strong> zhangsan@example.com</li>
</ul>
语法解析:

(图片来源网络,侵删)
{foreach $user as $value}: 这是最简单的形式,$user是要遍历的数组,$value是当前元素的值,键名$key会被忽略。{foreach $user as $key => $value}: 这种形式可以同时获取到当前元素的键名 ($key) 和值 ($value),对于关联数组(如我们的示例),$keyname,age,email。
遍历二维数组(最常用场景)
这是 PHPCMS 开发中最常见的场景,比如循环输出文章列表、产品列表、友情链接等。
模板代码 (index.html):
<h2>文章列表(遍历二维数组)</h2>
<table border="1" cellpadding="5" cellspacing="0">
<thead>
<tr>
<th>ID</th>
<th>标题</th>
<th>作者</th>
<th>点击量</th>
<th>发布时间</th>
</tr>
</thead>
<tbody>
{foreach $articles as $article}
<tr>
<td>{$article.id}</td>
<td>{$article.title}</td>
<td>{$article.author}</td>
<td>{$article.click}</td>
<td>{$article.addtime}</td>
</tr>
{/foreach}
</tbody>
</table>
输出结果:
<h2>文章列表(遍历二维数组)</h2>
<table border="1" cellpadding="5" cellspacing="0">
<thead>
<tr>
<th>ID</th>
<th>标题</th>
<th>作者</th>
<th>点击量</th>
<th>发布时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>PHPCMS 入门教程(一)</td>
<td>李四</td>
<td>100</td>
<td>2025-10-26 10:00:00</td>
</tr>
<tr>
<td>2</td>
<td>PHPCMS 模板开发详解</td>
<td>王五</td>
<td>250</td>
<td>2025-10-27 15:30:00</td>
</tr>
<tr>
<td>3</td>
<td>PHPCSS 数据库操作技巧</td>
<td>赵六</td>
<td>80</td>
<td>2025-10-28 09:15:00</td>
</tr>
</tbody>
</table>
语法解析:
{foreach $articles as $article}:$articles是外层数组,每一次循环,$article会被赋值为内层数组(如['id' => 1, 'title' => '...'])。{$article.id}: 因为$article是一个数组,所以我们使用 来访问其内部的元素,即{$article.id}等同于 PHP 中的$article['id']。
foreachelse 子句
当传递给 foreach 的数组是空的时,{foreachelse} 和 {/foreach} 之间的内容将会被显示,这对于处理“没有数据”的情况非常有用。
修改 PHP 控制器,传递一个空数组:
// ... 在 init() 方法中
$empty_list = []; // 空数组
$this->assign('empty_list', $empty_list);
模板代码:
<h2>空列表演示</h2>
<ul>
{foreach $empty_list as $item}
<li>{$item.name}</li>
{foreachelse}
<li>暂无数据!</li>
{/foreach}
</ul>
输出结果:
<h2>空列表演示</h2>
<ul>
<li>暂无数据!</li>
</ul>
section 循环(较少用)
section 循环是 Smarty 提供的另一种循环方式,功能更强大,但语法也更复杂,它更像一个传统的 for 循环,在 PHPCMS 中,foreach 因为其简洁性而更常用。
基本语法:
{section name=loop_name loop=$array_name}
{$array_name[loop_name].property}
{/section}
name: 循环的内部名称,用于访问索引。loop: 要遍历的数组。
示例:
<h2>使用 section 遍历文章列表</h2>
{section name=i loop=$articles}
<p>
文章ID: {$articles[i].id} -
标题: {$articles[i].title}
</p>
{/section}
输出结果与 foreach 类似。
总结与最佳实践
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
foreach |
绝大多数情况,尤其是一维和二维数组。 | 语法简单、直观,可同时获取键和值。 | 功能相对 section 较少。 |
foreachelse |
配合 foreach 使用,处理空数组情况。 |
逻辑清晰,用户体验好。 | 必须与 foreach 成对使用。 |
section |
需要更复杂循环控制时(如指定起始、结束、步长)。 | 功能强大,类似编程语言中的 for 循环。 |
语法繁琐,可读性差,不推荐在简单遍历中使用。 |
给 PHPCMS 开发者的建议:
- 优先使用
foreach:在 99% 的场景下,foreach是你的最佳选择。 - 养成使用
foreachelse的习惯:为空数据提供友好的提示,是专业开发的基本要求。 - 明确数据来源:永远记住,模板中的变量都来自于 PHP 控制器的
$this->assign(),调试时,先检查 PHP 代码是否正确地传递了数据。 - 变量修饰:在模板中可以对遍历出的数据进行格式化,
{$article.addtime|date:'Y-m-d H:i'}: 将时间戳格式化为日期。{$article.click|default:0}: 如果点击量为空,则显示 0。
