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

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 中进行遍历了。

phpcms在模板中遍历数组
(图片来源网络,侵删)

遍历一维数组 (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>

语法解析:

phpcms在模板中遍历数组
(图片来源网络,侵删)
  • {foreach $user as $value}: 这是最简单的形式,$user 是要遍历的数组,$value 是当前元素的值,键名 $key 会被忽略。
  • {foreach $user as $key => $value}: 这种形式可以同时获取到当前元素的键名 ($key) 和值 ($value),对于关联数组(如我们的示例),$key name, 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 开发者的建议:

  1. 优先使用 foreach:在 99% 的场景下,foreach 是你的最佳选择。
  2. 养成使用 foreachelse 的习惯:为空数据提供友好的提示,是专业开发的基本要求。
  3. 明确数据来源:永远记住,模板中的变量都来自于 PHP 控制器的 $this->assign(),调试时,先检查 PHP 代码是否正确地传递了数据。
  4. 变量修饰:在模板中可以对遍历出的数据进行格式化,
    • {$article.addtime|date:'Y-m-d H:i'}: 将时间戳格式化为日期。
    • {$article.click|default:0}: 如果点击量为空,则显示 0。