您的位置:首页 > 编程语言 > PHP开发

php不用eval实现字符串转数组

2017-07-01 16:07 239 查看
在一些项目中,我们经常需要将下面这种字符串转化为数组

array(array('name'=>'Home','single'=>'0','modelid'=>'11'))

这时候,可以直接用eval来解决,可是一旦这段字符串出现错误,eval会导致程序停止运行。

针对这个问题,我最近写了一个方法,初步实现了String转Array的功能,代码如下

<?php
/**
* @param String $string
* @return array|bool
* 字符串转数组,用以替换eval(),支持多维索引,键值对数组
* 数组格式错误返回布尔false,成功解析返回数组
* by Bob Wang 2017-05-18
*/
function array_encode($string){
//删除空格
$string=str_replace(' ','',$string);
//容错空数组
if($string=='array()'){
return array();
}
//数组格式容错
if(substr($string,0,6)=='array('&&$string[strlen($string)-1]==')'){
$Array=array();
$array=substr($string,6,strlen($string)-7);
//容错,不要分隔小数组中的逗号
if(strpos($array,'array(')===0){
$array=str_replace(",array",",#array",$array);
$array=explode(',#',$array);
}else{
$array=explode(',',$array);
}
if(strpos($array[0],'array(')===0){
//小数组
foreach($array as $key => &$value){
$Array[]=array_encode($value);
}
}elseif(strpos($array[0],'=>')){
//键值对数组
foreach($array as $key => &$value){
//容错,不要分隔小数组中的键值符号
if(strpos($value,'array(')>0){
$value=str_replace("=>array","=>#array",$value);
$value=explode('=>#',$value);
}else{
$value=explode('=>',$value);
}
if(!(strpos($value[1],'\'')===0||strpos($value[1],'"')===0||strpos($value[1],'array')===0)){
if(strpos($value[1],'.')>0){
//双精度
$Array[preg_replace("/'|\"/","",$value[0])]=(double)$value[1];
}else{
//整形
$Array[preg_replace("/'|\"/","",$value[0])]=(int)$value[1];
}
}elseif(strpos($value[1],'array')===0){
//小数组
$Array[preg_replace("/'|\"/","",$value[0])]=array_encode($value[1]);
}else{
//字符串
$Array[preg_replace("/'|\"/","",$value[0])]=preg_replace("/'|\"/","",$value[1]);
}
}
}else{
//索引数组
foreach($array as $key =>&$value){
if(!(strpos($value,'\'')===0||strpos($value,'"')===0||strpos($value,'array')===0)){
if(strpos($value,'.')>0){
//双精度
$Array[]=(double)$value;
}else{
//整形
$Array[]=(int)$value;
}
}elseif(strpos($value,'array')===0){
//小数组
$Array[]=array_encode($value);
}else{
//字符串
$Array[]=preg_replace("/'|\"/","",$value);
}
}
}
return $Array;
}else{
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: