php不用eval實現字串轉陣列
阿新 • • 發佈:2019-01-07
<?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; } }