php 函数中静态变量使用的问题实例分析
本文实例讲述了php函数中静态变量使用的问题。分享给大家供大家参考,具体如下:
'; } msg(); msg(); msg();
上述代码,分别输出0,1,2静态变量$a在第一次定义并初始化后就会常驻内存,直到脚本执行完毕。
当第二次调用msg()函数时,这时的$a值为1,而不会变成0。
那么问题来了,请看下面的一段代码:
$data=array(
array('id'=>1,'title'=>'衣服','parent'=>0),
array('id'=>2,'title'=>'鞋子','parent'=>0),
array('id'=>3,'title'=>'衬衫','parent'=>1),
array('id'=>4,'title'=>'T恤','parent'=>1),
array('id'=>5,'title'=>'运动鞋','parent'=>2),
array('id'=>6,'title'=>'休闲鞋','parent'=>2),
);
$data2=array(
array('id'=>1,'title'=>'食物','parent'=>0),
array('id'=>2,'title'=>'肉食','parent'=>1),
array('id'=>3,'title'=>'素食','parent'=>1),
array('id'=>4,'title'=>'牛肉','parent'=>2),
array('id'=>5,'title'=>'面条','parent'=>3),
array('id'=>6,'title'=>'馒头','parent'=>3),
);
//生成树型数据
functiongenTree($items,$id='id',$pid='parent',$son='child'){
$tree=array();
$tmpMap=array();
foreach($itemsas$item){
$tmpMap[$item[$id]]=$item;
}
foreach($itemsas$item){
if(isset($tmpMap[$item[$pid]])){
$tmpMap[$item[$pid]][$son][]=&$tmpMap[$item[$id]];
}else{
$tree[]=&$tmpMap[$item[$id]];
}
}
unset($tmpMap);
return$tree;
}
//通过给定数据,返回option的字符串,用于select下拉框
functiongetOpts($data,$idArr=array(),$level=0,$son='child'){
static$opt='';
if(!empty($data)){
foreach($dataas$k=>$v){
$opt.=''.str_repeat('',$level*3).$v['title'].'';
if(!empty($v[$son])){
getOpts($v[$son],$idArr,$level+1,$son);
}
}
}
return$opt;
}
$data=genTree($data);
echo'';
$data2=genTree($data2);
echo'';
上述问题,对于可能多次调用的函数,不建议在内部使用静态变量。
修改getOpts函数如下,从函数参数引入一个外部变量的引用,来解决此问题。
functiongetOpts($data,$idArr=array(),&$opt='',$level=0,$son='child'){
if(!empty($data)){
foreach($dataas$k=>$v){
$opt.=''.str_repeat('',$level*3).$v['title'].'';
if(!empty($v[$son])){
getOpts($v[$son],$idArr,$opt,$level+1,$son);
}
}
}
}
$data=genTree($data);
getOpts($data,array(),$opt);
echo'';
$data2=genTree($data2);
getOpts($data2,array(),$opt2);
echo'';
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php常用函数与技巧总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》及《php程序设计算法总结》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。