1. 读取记录
while($row=mysql_fetch_array($result))
{$record[]=array(
'title'=>$row['title'],
'body'=>$row['body'],);
}
$smarty->assign('yes', $record);//传说中的替换变量,即将$record赋给yes
2.在前台展示
{foreach item=news from=$yes}
{$news.title}:{$news.body}
<br>
{/foreach}
本文链接:http://www.cnblogs.com/zgaspnet/p/3270024.html,转载请注明。
$now_time = time();
$date=date("Y-m-d",$now_time);
function get_date($date,$t='d',$n=0)
{
if($t=='d'){
$firstday = date('Y-m-d 00:00:00',strtotime("$n day"));
$lastday = date("Y-m-d 23:59:59",strtotime("$n day"));
}elseif($t=='w'){
if($n!=0){$date = date('Y-m-d',strtotime("$n week"));}
$lastday = date("Y-m-d 00:00:00",strtotime("$date Sunday"));
$firstday = date("Y-m-d 23:59:59",strtotime("$lastday -6 days"));
}elseif($t=='m'){
if($n!=0){$date = date('Y-m-d',strtotime("$n months"));}
$firstday = date("Y-m-01 00:00:00",strtotime($date));
$lastday = date("Y-m-d 23:59:59",strtotime("$firstday +1 month -1 day"));
}
return array($firstday,$lastday);
}
$day1 = get_date($date,'d');
$day2 = get_date($date,'d',-1);
$week1 = get_date($date,'w');
$week2 = get_date($date,'w',-1);
$month1 = get_date($date,'m');
$month2 = get_date($date,'m',-1);
echo '<pre>';
print_r($day1);//今天
print_r($day2);//昨天
print_r($week1);//这周
print_r($week2);//上周
print_r($month1);//这月
print_r($month2);//上月
echo '</pre>';
本文链接:http://www.cnblogs.com/wlgaojin/p/3270266.html,转载请注明。
首先说下今天想到的一个问题。在编写php扩展的时候,似乎参数(即传给zend_parse_parameters的变量)是不需要free的。举例:
{
char* str;
int str_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
RETURN_FALSE;
}
php_printf(str);
// 无需free(str)
}
运行正常:
这里不用担心test函数会发生内存泄露,php会自动帮我们回收这些用于保存参数的变量。
那php究竟是如何做到的呢?要解释这个问题,还是得看php是怎么传递参数的。
EG(argument_stack)简介
简单来讲,在php中的EG中保存了一个专门用于存放参数的栈,名为argument_stack。每当发生函数调用的时候,php会将传入的参数压进EG(argument_stack)。一旦函数调用结束,则EG(argument_stack)被清理,并且等待下一次的函数调用。
关于EG(argument_stack)的struct结构、用途,php5.2和5.3实现有一些区别。本文主要以5.2为例,5.3+的变化后面抽空再说。
上图是5.2中argument_stack的大概示意图,看起来简单明了。其中,栈顶和栈底固定为NULL。函数接收的参数按照从左到右的顺序,依次被压入栈。注意,最后会被额外压入一个long型的值,表示栈里的参数个数(上图中为10)。
那被压入argument_stack的参数究竟是什么呢?其实是一个个zval类型的指针。它们指向的zva有可能是CV变量,有可能是is_ref=1的变量,还有可能是一个常量数字,或者常量字符串。
EG(argument_stack)在php5.2中被具体实现为zend_ptr_stack类型:
int top; // 栈中当前元素的个数
int max; // 栈中最多存放元素的个数
void **elements; // 栈底
void **top_element; // 栈顶
} zend_ptr_stack;
初始化argument_stack
初始化argument_stack的工作是发生在php处理具体的请求之前,更准确说是处于php解释器的启动过程之中。
在init_executor函数里我们发现如下2行:
zend_ptr_stack_push(&EG(argument_stack), (void *) NULL);
这2行分别代表着,初始化EG(argument_stack),紧接着压入一个NULL。由于EG是个全局变量,因此在实际调用zend_ptr_stack_init之前,EG(argument_stack)中的所有数据全部为0。
zend_ptr_stack_init实现很简单。
{
stack->top_element = stack->elements = (void **) emalloc(sizeof(void *)*PTR_STACK_BLOCK_SIZE);
stack->max = PTR_STACK_BLOCK_SIZE; // 栈的大小被初始化成64
stack->top = 0; // 当前元素个数为0
}
一旦argument_stack被初始化完,则立即会被压入NULL。这里无须深究,这个NULL其实没有任何的含义。
NULL入栈之后,整个argument_stack的实际内存分布如下: