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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。