php 其他格式数据与数组互转

class otherArr {

    private $char="UTF-8";
    private $cvs_fege=","; // cvs 分割符

    /**其他格式数据 转 数组
     * @parem $data 要转换的数据
     * @parem $format xml json cvs
     * @return  string 如果没有数据传入返回 false
     * */
    public function  other_array($data,$format="json")
    {
        if(!is_array($data) || empty($data))
        {
            return false;
        }
        $format=strtolower($format);
        switch($format)
        {
            case "xml":
                $data2=$this->arr_xml($data);
                break;
            case "cvs":
                $data2=$this->arr_cvs($data);
                break;
            default:
                $data2=$this->arr_json($data);
                break;
        }
         return $data2;
    }

    /**数组 转 其他格式数据
     * @parem $data 要转换的数据
     * @parem $format 原数据格式
     * @return arr 如果没有数据传入返回 false
     * */
    public function array_other($data,$format)
    {
          if(!isset($data) || !isset($format) || empty($data) || empty($format))
          {
              return false;
          }
          $format=strtolower($format);
          switch($format)
          {
            case "xml":
                $data2=$this->xml_arr($data);
                break;
              case "cvs":
                  $data2=$this->cvs_arr($data);
                  break;
              case "json":
                  $data2=$this->json_arr($data);
                  break;
              default :
                  return $data;// 返回原数据
          }
          return $data2;

    }

    //------------------------------------------------------------数组转其他格式 start
    /** 数组 转 xml  * */
    private function arr_xml($data)
    {
        $xml = "<xml>";
        foreach ($data as $key=>$val)
        {
            $xml.="<".$key.">".$val."</".$key.">";
        }
        $xml.="</xml>";
        return $xml;
    }

    /** 数组 转 cvs  * */
    private function arr_cvs($data)
    {
        $string="";
        foreach ($data as $k=> $v)
        {
            $data[$k]=$this->char_conv($data[$k]);
        }
        $string .= implode($this->cvs_fege,$data)."\n"; //用英文逗号分开
        return $string;
    }

    /** 数组 转 json * */
    private function arr_json($data)
    {
        foreach($data as $k=>$v)
        {
            $data[$k]=$this->char_conv($data[$k]);
        }
        return json_encode($data);
    }
    //------------------------------------------------------------数组转其他格式 end


    //------------------------------------------------------------其他格式转数组 start
    /** xml 转 数组 **/
    private function xml_arr($data)
    {
        //libxml_disable_entity_loader(true);禁止外部调用
        return json_decode(json_encode(simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    }
    /** json 转 数组 **/
    private function json_arr($data)
    {
        $data=$this->char_conv($data);
        return json_decode($data,true);
    }
    /** cvs 转 数组 **/
    private function cvs_arr($data)
    {
        $data=$this->char_conv($data);
        $data=explode($this->cvs_fege,$data);
        return $data;
    }
    //------------------------------------------------------------其他格式转数组 end


    /** 取得当前字符编码
     * @parem $str 要检验的字符
     * @parem  string 字符集
     * */
    private function get_character($str)
    {
        if(function_exists("mb_detect_encoding"))
        {
            return mb_detect_encoding($str);
        }else
        {
           if($this->is_gb2312($str))
           {
               return "GB2312";
           }else
           {
               return $this->char;
           }
        }
    }

    /** 判断是gbk还是utf-8 只应用于中文
     * @parem $str 要检验的字符
     * @return  bool: true - 含GB编码 false - 为UTF-8编码
     * */
    private function is_gb2312($str)
    {
        for($i=0; $i<strlen($str); $i++)
        {
            $v = ord( $str[$i] );
            if( $v > 127)
            {
                if( ($v >= 228) && ($v <= 233) )
                {
                    if( ($i+2) >= (strlen($str) - 1)) return true;  // not enough characters
                    $v1 = ord( $str[$i+1] );
                    $v2 = ord( $str[$i+2] );
                    if( ($v1 >= 128) && ($v1 <=191) && ($v2 >=128) && ($v2 <= 191) ) // utf编码
                        return false;
                    else
                        return true;
                }
            }
        }
        return true;
    }

    /**转换字符
     * */
    private function char_conv($str)
    {
        $character=$this->get_character($str);
        if($character==$this->char)
        {
            return $str;
        }
        if(function_exists('mb_convert_encoding'))
        {
            $str=mb_convert_encoding($str, $this->char,$character);
        }else if(function_exists('iconv'))
        {
            $str2=iconv($this->char, "$character.'//IGNORE'", $str);
            if(!empty($str2))// 如果字符不能以目标字符集表达的字符将被默默丢弃 防止字符为空
            {
                return $str2;
            }
        }
        // 如果没有转换字符函数 直接返回字符
        return $str;
    }
}

调用示例:仅用于一维数组

// 调用示例
$arr = array ('a'=>'dsfsf','b'=>2,'c'=>3,'d'=>4,'e'=>5);
$otherArr=new otherArr();
$f_data=$otherArr->other_array($arr,"cvs");
var_dump($f_data);

$data_f=$otherArr->array_other($f_data,"cvs");
echo "<pre>";
var_dump($data_f);
echo "<pre/>";

猜你喜欢

转载自www.cnblogs.com/xuey/p/9480884.html