1. 程式人生 > >php不用eval實現字串轉陣列

php不用eval實現字串轉陣列

<?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;
    }
}