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 相关文章推荐
php5 and xml示例
Nov 22 PHP
ZF等常用php框架中存在的问题
Jan 10 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
解析wamp5下虚拟机配置文档
Jun 27 PHP
php过滤html标记属性类用法实例
Sep 23 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 PHP
示例详解Laravel的注册重构
Aug 14 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
Jun 20 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
php post换行的方法
Feb 03 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
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
使用jQuery的将桌面应用程序引入浏览器
2010/11/19 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
超级简单实现JavaScript MVC 样式框架
2015/03/24 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
浅谈python中的占位符
2017/11/09 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
Python requests上传文件实现步骤
2020/09/15 Python
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
企业项目策划书
2014/01/11 职场文书
总经理助理工作职责
2014/02/06 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
师德师风建设方案
2014/05/08 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
机械机修工岗位职责
2014/08/03 职场文书
学习教师法的心得体会
2014/09/03 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
python中24小时制转换为12小时制的方法
2021/06/18 Python
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python
Python中requests库的用法详解
2022/06/05 Python