您的位置:首页 > 移动开发

Smarty循环实例详解

2010-10-27 11:56 387 查看
在Smarty应用,常常会遇到循环问题,在这里做一个详细的说明。首先是参数说明:

loop 属性:

the loop variable only determines the number of times to loop

loop 循环所赋的变量仅决定循环的次数,可以任意!!!

section 属性:

the name of the section can be anything you like,and it is used to reference

the data within the section

section 属性的值可以是任意的,而且在循环中只能使用该名字作为替换

数据,也就是[section]里的值。

下面给出示例来具体说明应用方法(PHP 代表PHP 部分代码,HTML 代表模板

内容,OUTPUT 代表输出内容):

1、一维索引数组循环。

PHP代码
$suoyin1
=
array
(
'1000'
,
'1001'
,
'1002'
);   

$smarty
->assign(
'suoyin1'
,
$suoyin1
);   

 

XML/HTML代码
<
{section 
name
=
n1
 
loop
=$suoyin1}
>
  

id: 
<
{$suoyin1[n1]}
>
  

<
{/section}
>
  

OUTPUT:

id:1000 id:1001 id:1002

2、如果多个数组包含相同数量的元素,可以将他们合并写出,这里说明了loop 只代

表循环次数。

PHP代码
$id
=
array
(
'1000'
,
'1001'
,
'1002'
);   

$name
=
array
(
'John Smith'
,
'Jack Jones'
,
'Jane Munson'
);   

$address
=
array
(
'253 N 45th'
,
'417 Mulberry ln'
,
'5605 apple st'
);   

$smarty
->assign(
'id'
,
$id
);   

$smarty
->assign(
'name'
,
$name
);   

$smarty
->assign(
'address'
,
$address
);  

XML/HTML代码
<
{section 
name
=
h1
 
loop
=$name}
>
  

id:
<
{$id[h1]}
>
  

name:
<
{$name[h1]}
>
  

address:
<
{$address[h1]}
>
  

<
{/section}
>
  

OUTPUT:

id:1000 name:John Smith address:253 N 45th

id:1001 name:Jack Jones address:417 Mulberry ln

id:1002 name:Jane Munson address:5605 apple st

3、一维关联数组不要循环。

PHP代码
$bst
=
array
(
'id'
=>
'1000'
,
'name'
=>
'John Smith'
,
'address'
=>
'253 N 45th'
);   

$smarty
->assign(
'bst'
,
$bst
);  

XML/HTML代码
id:
<
{$bst.id}
>
  

name:
<
{$bst.name}
>
  

address:
<
{$bst.address}
>
  

OUTPUT:

id:1000 name:John Smith address:253 N 45th

4、二维关联数组,用到基本循环。

PHP代码
$erwei
=
array
(
array
(
'id'
=>
'1000'
,
'name'
=>
'John Smith'
,
'address'
=>
'253 N 45th'
),   

array
(
'id'
=>
'1001'
,
'name'
=>
'Jack Jones'
,
'address'
=>
'417 Mulberry ln'
),   

array
(
'id'
=>
'1002'
,
'name'
=>
'Jane Munson'
,
'address'
=>
'5605 apple st'
));   

$smarty
->assign(
'erwei'
,
$erwei
);  

XML/HTML代码
<
{section 
name
=
h2
 
loop
=$erwei}
>
  

id:
<
{$erwei[h2].id}
>
  

name:
<
{$erwei[h2].name}
>
  

address:
<
{$erwei[h2].address}
>
  

<
{/section}
>
  

OUTPUT:

id:1000 name:John Smith address:253 N 45th

id:1001 name:Jack Jones address:417 Mulberry ln

id:1002 name:Jane Munson address:5605 apple st

5、sectionelse 控制当没变量的时候显示,比如你打开的文章(产品)不存在或已删

除!

XML/HTML代码
<
{section 
name
=
customer
 
loop
=$custid}
>
  

id: 
<
{$custid[customer]}
>
  

<
{sectionelse}
>
  

there are no values in $custid.   

<
{/section}
>
  

6、section 多层循环

PHP代码
$id
 = 
array
(1001,1002,1003);   

$smarty
->assign(
'custid'
,
$id
);   

$fullnames
 = 
array
(
'John Smith'
,
'Jack Jones'
,
'Jane Munson'
);   

$smarty
->assign(
'name'
,
$fullnames
);   

$addr
 = 
array
(
'253 N 45th'

'417 Mulberry ln'

'5605 apple st'
);   

$smarty
->assign(
'address'
,
$addr
);   

$types
 = 
array
(   

array

'home phone'

'cell phone'

'e-mail'
),   

array

'home phone'

'web'
),   

array

'cell phone'
)   

);   

$smarty
->assign(
'contact_type'

$types
);   

$info
 = 
array
(   

array
(
'555-555-5555'

'666-555-5555'

'john@myexample.com'
),   

array

'123-456-4'

'www.example.com'
),   

array

'0457878'
)   

);   

$smarty
->assign(
'contact_info'

$info
);   

 

XML/HTML代码
<
{section 
name
=
customer
 
loop
=$custid}
>
  

id: 
<
{$custid[customer]}
>
  

name: 
<
{$name[customer]}
>
  

address: 
<
{$address[customer]}
>
  

<
{section 
name
=
contact
 
loop
=$contact_type[customer]}
>
  

<
{$contact_type[customer][contact]}
>

<
{$contact_info[customer][contact]}
>
  

<
{/section}
>
  

<
{/section}
>
  

OUTPUT:

id: 1001

name: John Smith

address: 253 N 45th

home phone: 555-555-5555

cell phone: 666-555-5555

e-mail:5656@126.com

id: 1002

name: 232

address: 417 Mulberry ln

home phone: 123-456-4

web:www.example.com

3

id: 1003

name: Jane Munson

address: 5605 apple st

cell phone: 0457878

7、多层嵌套循环:这里联系方式还嵌套了一个一维数组,有cell phone、home phone

和email。注意嵌套的一维数组不要循环!!内嵌套写法$mu[sec1].contact.home。

PHP代码
$mu
=
array
(
array
(
'id'
=>
'1000'
,   

'name'
=>
'John Smith'
,   

'address'
=>
'253 N 45th'
,   

'contact'
=>
array
(
'home'
=>
'555-55-555'
,
'bell'
=>
'1111111'
)   

),   

array
(
'id'
=>
'1001'
,   

'name'
=>
'Jack Jones'
,   

'address'
=>
'417 Mulberry ln'
,   

'contact'
=>
array
(
'home'
=>
'444-44-444'
,
'bell'
=>
'2222222'
)   

),   

array
(
'id'
=>
'1002'
,   

'name'
=>
'Jane Munson'
,   

'address'
=>
'5605 apple st'
,   

'contact'
=>
array
(
'home'
=>
'333-33-333'
,
'bell'
=>
'4444444'
)   

)   

);   

$smarty
->assign(
'mu'
,
$mu
);   

 

XML/HTML代码
<
{section 
name
=
sec1
 
loop
=$mu}
>
  

id:
<
{$mu[sec1].id}
>
  

name:
<
{$mu[sec1].name}
>
  

address:
<
{$mu[sec1].address}
>
  

array:
<
{$mu[sec1].contact}
>
  

home phone:
<
{$mu[sec1].contact.home}
>
  

cell phone:
<
{$mu[sec1].contact.bell}
>
  

====================================================================   

<
{/section}
>
  

OUTPUT:

id:1000

name: John Smith

address:253 N 45th

array:Array

home phone:555-55-555

cell phone:1111111 =================================================id:1001

name:Jack Jones

address:417 Mulberry ln

array:Array

home phone:444-44-444

cell phone:2222222 ================================================id:1002

name:Jane Munson

address:5605 apple st

array:Array

home phone:333-33-333

cell phone:4444444

8 、多层嵌套循环。内部嵌套二维数组, 加个循环!! 内嵌套写法

$forum[sec1].topic[sec2].topic_name。

PHP代码
$forum
 = 
array
(
array
(
"category_id"
 => 1,   

"category_name"
 => 
"公告区"
,   

"topic"
 => 
array
(   

array
(
"topic_id"
 => 1, 
"topic_name"
 => 
"站务公告"
)   

)   

),   

array
(
"category_id"
 => 2,   

"category_name"
 => 
"文学专区"
,   

"topic"
 => 
array
(   

array
(
"topic_id"
 => 2, 
"topic_name"
 => 
"好书介绍"
),   

array
(
"topic_id"
 => 3, 
"topic_name"
 => 
"奇文共赏"
)   

)   

),   

array
(
"category_id"
 => 3,   

"category_name"
 => 
"计算机专区"
,   

"topic"
 => 
array
(   

array
(
"topic_id"
 => 4, 
"topic_name"
 => 
"硬件外围"
),   

array
(
"topic_id"
 => 5, 
"topic_name"
 => 
"软件讨论"
)   

)   

)   

);   

$smarty
->assign(
"forum"

$forum
);   

 

XML/HTML代码
<
{section 
name
=
sec1
 
loop
=$forum}
>
  

<
{$forum[sec1].category_name}
>
  

<
{section 
name
=
sec2
 
loop
=$forum[sec1].topic}
>
  

<
{$forum[sec1].topic[sec2].topic_name}
>
  

<
{/section}
>
  

<
{/section}
>
  

OUTPUT:

公告区

站务公告

文学专区

好书介绍

奇文共赏

计算机专区

硬件外围

软件讨论

9、section 和forech 循环的用法比较

PHP代码
$array2
 = 
array
(   

array
(
"index1"
 => 
"data1-1"

"index2"
 => 
"data1-2"

"index3"
 => 
"data1-3"
),   

array
(
"index1"
 => 
"data2-1"

"index2"
 => 
"data2-2"

"index3"
 => 
"data2-3"
),   

array
(
"index1"
 => 
"data3-1"

"index2"
 => 
"data3-2"

"index3"
 => 
"data3-3"
),   

array
(
"index1"
 => 
"data4-1"

"index2"
 => 
"data4-2"

"index3"
 => 
"data4-3"
),   

array
(
"index1"
 => 
"data5-1"

"index2"
 => 
"data5-2"

"index3"
 => 
"data5-3"
)   

);   

$smarty
->assign(
"array2"

$array2
);   

 

XML/HTML代码
foreach   

<
{foreach 
item
=
index2
 
from
=$array2}
>
  

<
{foreach 
key
=
key2
 
item
=
item2
 
from
=$index2}
>
  

<
{$key2}
>

<
{$item2}
>
  

<
{/foreach}
>
  

<
{/foreach}
>
  

section   

<
{section 
name
=
sec2
 
loop
=$array2}
>
  

index1: 
<
{$array2[sec2].index1}
>
  

index2: 
<
{$array2[sec2].index2}
>
  

index3: 
<
{$array2[sec2].index3}
>
  

<
{/section}
>
  

OUTPUT:

index1: data1-1 index2: data1-2 index3: data1-3 index1: data2-1 index2: data2-2 index3: data2-3

index1: data3-1 index2: data3-2 index3: data3-3 index1: data4-1 index2: data4-2 index3: data4-3

index1: data5-1 index2: data5-2 index3: data5-3

10、显示数据库的资料

表posts 文章列表

字段

pid INT(10) AUTO_INCREMENT 文章ID

cid INT(10) 分类ID

ptitle varchar(100) 文章标题

pcontent text 文章内容

ptime INT(11) 文章发表日期

和简单关联二维数组一样。

PHP代码
$conn
=mysql_connect(
'localhost'
,
'root'
,
'pass'
);   

mysql_select_db(
'dbname'
,
$conn
);   

mysql_query(
"SET NAMES 'GBK'"
);   

$sql
=
"SELECT * FROM posts"
;   

$result
=mysql_query(
$sql
);   

$posts
=mysql_fetch_array(
$result
);   

$smarty
->assign(
'posts'
,
$posts
);   

 

XML/HTML代码
<
{section 
name
=
h
 
loop
=$posts}
>
  

标题: 
<
{$posts[h].ptitle}
>
  

内容: 
<
{$posts[h].pcontent}
>
  

发布时间: 
<
{$posts[h].ptime|date_format:"%Y-%m-%d %H:%M:%S"}
>
  

<
{/section}
>
  

OUTPUT:

标题:标题一内容:内容一发布时间:2008-1-1 10:20:15

标题:标题二内容:内容二发布时间:2008-4-1 8:1:12

表category 文章分类表

cid 文章分类ID

cname 分类名

这里要循环出所有分类,以及分类下的所有帖子,也就是一个嵌套循环。

PHP

PHP代码
$sql
=
"SELECT * FROM category"
;   

$result
=mysql_query(
$sql
);   

$cat
=
array
(); 
//第一层数组
  

while
(
$array1
=mysql_fetch_array(
$result
)){ 
//第一层数据
  

$sql2
=
"SELECT * FROM posts WHERE cid={$cat[cid]}"
;   

$rs
=mysql_query(
$sql2
);   

$posts
=
array
(); 
//第二层数组
  

while
(
$array2
=mysql_fetch_array(
$rs
)){ 
//第二层数据
  

array_push
(
$posts
,
$array2
); 
//压入数组posts 中
  

}   

$array1
[
'posts'
]=
$posts

// 把第二层数组指定为第一层数据中的一个成员
  

array_push
(
$cat
,
$array1
); 
//把数据放入数组$cat 中
  

}   

$smarty
->assign(
'cat'
,
$cat
);   

 

XML/HTML代码
<
{section 
name
=
sec1
 
loop
=$cat}
>
  

分类:
<
{$cat[sec1].cname}
>
  

<
{section 
name
=
sec2
 
loop
=$cat[sec1].posts}
>
  

标题: 
<
{$cat[sec1].posts[sec2].ptitle}
>
  

内容: 
<
{$cat[sec1].posts[sec2].pcontent}
>
  

发布时间: 
<
{$cat[sec1].posts[sec2].pcontent|date_format:"%Y-%m-%d %H:%M:%S"}
>
  

<
{/section}
>
  

OUTPUT:

分类:分类1

标题:标题一内容:内容一发布时间:2008-1-1 10:20:15

标题:标题二内容:内容二发布时间:2008-4-1 8:1:12

分类:分类2

标题:标题三内容:内容三发布时间:2008-1-1 10:20:15

标题:标题四内容:内容四发布时间:2008-4-1 8:1:12
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息