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

class otherArr {

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

    /**数组 转 其他格式数据
     * @parem $data 要转换的数据
     * @parem $format xml json cvs
     * @return  string 如果没有数据传入返回 false
     * */
    public function  array_other($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 原数据格式
     * @parem $tit_true 二维数组第二层key 值是否相同,默认相同 为true
     * @return arr 如果没有数据传入返回 false
     * */
    public function other_array($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 $k=>$v)
        {
            if(is_array($v))
            {
                $xml.=is_numeric($k)?"":"<".$k.">";
                foreach ($v as $kk=>$vv)
                {
                    $xml.="<".$kk.">".$vv."</".$kk.">";
                }
                $xml.=is_numeric($k)?"":"</".$k.">";
            }else
            {
                $xml.="<".$k.">".$v."</".$k.">";
            }
        }
        $xml.="</xml>";
        return $xml;
    }

    /** 一维 二维 数组 转 cvs  * */
    private function arr_cvs($data)
    {
        $string="";
        // 判断是一维数组还是二维数组  如果是一维数组
        if(count($data) == count($data,1))
        {
            $tit=array_keys($data);
            $string .= implode($this->cvs_fege,$tit)."
";
        }else
        {
            $v_tit="";
        }

        foreach ($data as $k=> $v)
        {
            if(is_array($v)) // 二维数组
            {
                if(empty($v_tit)) // 如果第二层循环中的key 值相同,只取一次值
                {
                    $v_tit=array_keys($v);
                    $string .= implode($this->cvs_fege,$v_tit)."
";
                }
                $string .= implode($this->cvs_fege,$v)."
";
            }

        }
        // 一维数组
        if(count($data) == count($data,1))
        {
            $string .= implode($this->cvs_fege,$data)."
";
        }
        return $this->char_gbk($string); // execle 打开cvs 不乱码
    }

    /** 数组 转 json * */
    private function arr_json($data)
    {
        foreach($data as $k=>$v)
        {
            if(is_array($v)) // 二维数组
            {
                foreach($v as $kk=>$vv)
                {
                    $v[$kk]=$this->char_utf($v[$kk]);
                }
            }else           //  一维数组
            {
                $data[$k]=$this->char_utf($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_utf($data);
        return json_decode($data,true);
    }

    /** cvs 转 数组   返回二维数组 **/
    private function cvs_arr($data)
    {
        $data=array_values(array_filter(explode("
",$data)));
        foreach($data as $k=>$v)
        {
            if($k<1)
            {
                $tit=explode($this->cvs_fege,$v);
            }else
            {
                $v_arr=array_values(array_filter(explode($this->cvs_fege,$v)));
                foreach($tit as $kkk=>$vvv)
                {
                    $new_data[$k-1][$tit[$kkk]]=$v_arr[$kkk];
                }
            }
        }
        unset($data);
        return $new_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;   // utf-8
                    else
                        return true;  // gbk
                }
            }
        }
        return true; // gb2312
    }

    /**转换字符 其他字符转utf8
     * */
    private function char_utf($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($character,$this->char."//IGNORE", $str);
            if(!empty($str2))// 如果字符不能以目标字符集表达的字符将被默默丢弃 防止字符为空
            {
                return $str2;
            }
        }
        // 如果没有转换字符函数 直接返回字符
        return $str;
    }

    /** utf 转换 gbk
     * */
    private function char_gbk($str)
    {
        $char=$this->is_gb2312($str);
        if($char)
            return $str;
        if(function_exists('mb_convert_encoding'))
        {
            $str=mb_convert_encoding($str,"GBK",$this->char);
        }else if(function_exists('iconv'))
        {
            $str2=iconv($this->char,"GBK//IGNORE", $str);
            if(!empty($str2))// 如果字符不能以目标字符集表达的字符将被默默丢弃 防止字符为空
            {
                return $str2;
            }
        }
        return $str;
    }

}

cvs 转换中不保留 二维数组第一层循环的 key 值,第二层循环的key为一致的

// 调用示例 如果下载数据可以用excel 打开
$arr = array ('a'=>'dsfsf','b'=>2,'c'=>3,'d'=>4,'e'=>5);
$data=array(
    "a"=>array("username"=>"汉字","password"=>"123"),
    "b"=>array("username"=>"test2","password"=>"456"),
    "c"=>array("username"=>"test3","password"=>"789"),
);
$data2=array(
    array("username"=>"汉字","password"=>"123"),
    array("username"=>"test2","password"=>"456"),
    array("username"=>"test3","password"=>"789"),
    array("username"=>"test4","password"=>"111"),
    array("username"=>"test5","password"=>"222"),
);
$otherArr=new otherArr();
$f_data=$otherArr->array_other($data2,"cvs");
/*var_dump($f_data);
echo "<hr/>";
$f_data2=$otherArr->other_array($f_data,"cvs");*/
//var_dump($f_data2);

// 下载 cvs  文件
$filename = date('Ymd').'.csv'; //设置文件名
header("Content-type:text/csv");
header("Content-Disposition:attachment;filename=".$filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $f_data;

 excel 打开效果

 

 如果转码后还乱码,在输出数据前添加 BOM,标识 utf-8

$head=chr(0xEF).chr(0xBB).chr(0xBF); // 防止 excle 打开乱码

原文地址:https://www.cnblogs.com/xuey/p/9480884.html