PHP模板引擎Smarty内建函数foreach,foreachelse用法分析


Posted in PHP onApril 11, 2016

本文实例讲述了PHP模板引擎Smarty内建函数foreach,foreachelse用法。分享给大家供大家参考,具体如下:

在 Smarty 模板中,您可以使用 foreach 来重复一个区块。而在模板中则需要从 PHP 中分配过来一个数组。这个数组可以是多维数组。Smarty 中 {foreach} 标记和 PHP 中 foreach 相同,不同的是它们的一个在模板文件中使用,一个在 PHP 脚本中使用。因此,语法会不同。但是,它们的作用都是相同的,即遍历数组中的内容。与 {foreach} 标记相对的还有一个 {foreachelse} 标记,{foreachelse} 标记的作用是:如果数组为空,那么就执行该标记内的内容。 模板中 {foreach} 和 {/foreach} 必须是成对的出现,它有四个参数,其中, from 和 item 两个参数是必要的。关于它的参数请看下面列表:

属性 类型 是否必须 缺省值 描述
from string Yes n/a 待循环数组的名称
item string Yes n/a 当前处理元素的变量名称
key string No n/a 当前处理元素的键名
name string No n/a 该循环的名称,用于访问该循环

我们通过一个实例,来演示 Smarty 中 {foreach} 和 {foreachelse} 的使用。

实例思路:从数据库中取出内容,赋给一个数组变量 $_html ,再给这个数组变量分配给模板,然后在模板中进行该数组的遍历

test.sql (使用到的 SQL 数据)

--
-- 表的结构 `user`
--
CREATE TABLE IF NOT EXISTS `user` (
 `id` mediumint(8) unsigned NOT NULL auto_increment,
 `username` varchar(50) NOT NULL,
 `email` varchar(50) NOT NULL,
 `addTime` datetime NOT NULL default '0000-00-00 00:00:00',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
--
-- 转存表中的数据 `user`
--
INSERT INTO `user` (`id`, `username`, `email`, `addTime`) VALUES
(1, '苍井空', 'canjingkong@sina.com.cn', '2011-10-24 00:00:00'),
(2, '樱木花道', 'ymhd@163.com', '2011-10-24 00:00:00'),
(3, '赤木晴子', 'chimiqingzi@yahoo.com,cn', '2011-10-24 00:00:00'),
(4, '流川枫', 'lcfeng@sina.com', '0000-00-00 00:00:00'),
(5, '蜡笔小新', 'labixiaoxin@sina.com', '2011-10-24 00:00:00'),
(6, '金刚葫芦娃', 'jghlw@sina.com', '2011-10-24 00:00:00');

init.inc.php (模板初始化文件)

<?php
 define('ROOT_PATH', dirname(__FILE__)); //设置网站根目录
 require ROOT_PATH.'/libs/Smarty.class.php'; //加载 Smarty 模板引擎
 $_tpl = new Smarty(); //创建一个实例对象
 $_tpl->template_dir = ROOT_PATH.'/tpl/'; //重新指定模板目录
 $_tpl->compile_dir = ROOT_PATH.'./com/'; //重新指定编译目录
 $_tpl->left_delimiter = '<{'; //重新指定左定界符
 $_tpl->right_delimiter = '}>'; //重新指定右定界符
?>

index.php(主文件)

<?php
 require 'init.inc.php'; //引入模板初始化文件
 global $_tpl;
 $_mysqli = new mysqli(); //创建一个 mysqli() 对象
 $_mysqli->connect('localhost','root','数据库密码','数据库名'); //连接数据库,请您自行设置
 $_mysqli->set_charset('utf8'); //设置编码
 $_result = $_mysqli->query("select username,email,addTime from user order by id asc");
 $_html = array();
 while (!!$_row=$_result->fetch_assoc()) {
  $_html[] = $_row;
 }
 $_tpl->assign('data',$_html); //把数组分配到模板中
 $_tpl->display('index.tpl'); //引入模板
 $_mysqli->close(); //关闭数据库,释放资源
?>

tpl/index.tpl(主文件 index.php 的模板文件)

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>foreach,foreachelse</title>
</head>
<body>
 <table align="center" border="1" width="800">
  <{foreach from=$data item="row" name="ls"}> <!-- 这个foreach 循环分配过来的数组有几行数据 -->
   <!-- 在此,我们做几个保留变量 $smarty.foreach 的操作 -->
   <!-- 当数据显示第一条的时候,第一行的表格背景为黄色,使用属性:first -->
   <!-- 当数据显示最后一条的时候,最后一行的表格背景为蓝色,使用属性:last -->
   <!-- 显示下分配过来的数组的总个数,使用属性:total -->
   <{if $smarty.foreach.ls.first}>
   <tr bgcolor="#FFFF00"> <!-- 第一行背景为黄色 -->
   <{elseif $smarty.foreach.ls.last}>
   <tr bgcolor="#0000FF"> <!-- 最后一行背景为蓝色 -->
   <{else}>
   <tr>
   <{/if}>
    <td><{$smarty.foreach.ls.iteration}></td><!-- 注意:这里是保留变量 $smarty.foreach 的使用,iteration:总是从 1 开始,每执行一次增加 1 -->
    <{foreach from=$row item="col" name="lsin"}> <!-- 这个foreach 循环数组内的内容,显示在表格的<td></td>标签里 -->
     <td><{$col}></td>
    <{/foreach}>
   </tr>
  <{foreachelse}> <!-- 如果分配过来的数组中没有数据,那么就执行下面的操作! -->
   <tr>
    <td>对不起!暂时没有数据。</td>
   </tr>
  <{/foreach}>
  <tr>
   <td colspan="4" align="center">分配数组的总记录数为:<{$smarty.foreach.ls.total}>条</td>
  </tr>
 </table>
</body>
</html>

执行结果:

PHP模板引擎Smarty内建函数foreach,foreachelse用法分析

最后总结下,主文件 index.php 中传递过去的数组 $_html 为二维数组。保留变量 $smarty.foreach 的使用都是基于 {foreach} 标记中的 name 属性,使用到的保留变量属性有:first(首条记录)、last(末条记录)、iteration(总是从 1 开始,每执行一次增加 1)、total(用于显示循环执行的次数)

希望本文所述对大家基于smarty模板的PHP程序设计有所帮助。

PHP 相关文章推荐
Zend Studio (eclipse)使用速度优化方法
Mar 23 PHP
php 代码优化之经典示例
Mar 24 PHP
php 计划任务 检测用户连接状态
Mar 29 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
PHP函数getenv简介和使用实例
May 12 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
PHP中调用C/C++制作的动态链接库的教程
Mar 10 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 #PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 #PHP
php实现生成验证码实例分享
Apr 10 #PHP
PHP实现简单实用的分页类代码
Apr 08 #PHP
PHP文件上传类实例详解
Apr 08 #PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 #PHP
php生成带logo二维码方法小结
Apr 08 #PHP
You might like
php设置session值和cookies的学习示例
2014/03/21 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
JavaScript面象对象设计
2008/04/28 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
js中string转int把String类型转化成int类型
2014/08/13 Javascript
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
2017/09/19 jQuery
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
[03:22]DOTA2超级联赛专访单车:找到属于自己的英雄
2013/06/08 DOTA
[02:29]完美世界高校联赛上海赛区回顾
2015/12/15 DOTA
一个基于flask的web应用诞生 用户注册功能开发(5)
2017/04/11 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
python实现的发邮件功能示例
2019/09/11 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
2020/02/26 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
Django haystack实现全文搜索代码示例
2020/11/28 Python
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
计算机通信专业推荐信
2014/02/22 职场文书
活动总结书
2014/05/08 职场文书
结对共建协议书
2014/08/20 职场文书
在校生证明
2015/06/17 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
Java中的Kotlin 内部类原理
2022/06/16 Java/Android