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)."\n";
}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)."\n";
}
$string .= implode($this->cvs_fege,$v)."\n";
}
}
// 一维数组
if(count($data) == count($data,1))
{
$string .= implode($this->cvs_fege,$data)."\n";
}
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("\n",$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 打开乱码
php 其他格式数据与数组互转的更多相关文章
- xml格式数据和数组数据互相转换
数组转换成xml数据 <?php $arr=array( 'username'=>'huahua', 'password'=>'123456', 'number'=>'1588 ...
- fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map
作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...
- 一个简单xml数据转换为数组的方法
本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻 ...
- iOS开发之JSON格式数据的生成与解析
本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...
- 解析json格式数据
实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...
- 使用C#中JavaScriptSerializer类将对象转换为Json格式数据
将对象转换为json格式字符串: private JavaScriptSerializer serializer = new JavaScriptSerializer(); protected voi ...
- 使用getJSON()方法异步加载JSON格式数据
使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery. ...
- Android读取JSON格式数据
Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...
- 使用基于Android网络通信的OkHttp库实现Get和Post方式简单操作服务器JSON格式数据
目录 前言 1 Get方式和Post方式接口说明 2 OkHttp库简单介绍及环境配置 3 具体实现 前言 本文具体实现思路和大部分代码参考自<第一行代码>第2版,作者:郭霖:但是文中讲 ...
随机推荐
- Android4.0+锁屏程序开发——按键屏蔽篇
开发锁屏程序的时候我们要面临的重要问题无疑是如何屏蔽三个按键,Back,Home,Menu 看似简单的功能,实现起来却并不是那么容易. [屏蔽Back按键] 相对来说,屏蔽Back键是比较简单的,只 ...
- 用rand5()生成rand(n)
问题:有函数rand5(),它能够等概率生成[0,5)之间的整数.由rand5()构造rand(n)使其能够等概率生成[0,n)之间的整数. 思路1:有rand5()先生成等概率生成0和1的rand0 ...
- lazyload is not a function解决方式
使用jQuery图片延迟加载插件时,可能会报出$("img").lazyload is not a function的错误.(关于如何使用lazyload插件,请看另外一篇文章:j ...
- 一段上传图片预览JS脚本,Input file图片预览的实现
在深圳做项目的时候,需要一个用户上传头像预览的功能!是在网上找了好多,都不太满意.要么是flash的,要么是Ajax上传后返回图片路径的,要么压根就是不能用的.幸运的是在这个项目以前有人写过一个图片预 ...
- 虚拟机ubuntu18.04设置静态IP
说明: 网关:192.168.8.2 待设置静态IP:192.168.8.25 1.编辑:vi /etc/netplan/01-network-manager-all.yaml 打开以后内容如下: # ...
- vue.js的生命周期 及其created和mounted的部分
网上很多人有所总结,转载自: https://segmentfault.com/a/1190000008570622 关于created和mounted的部分,也可以参考: https://blo ...
- css总结9:内边距(padding)和外边距(margin)
1 css总结9:内边距和外边距 通过css总结8:盒子模型可知:内边距(padding),外边距(margin).可以影响盒子在浏览器的位置. 1.1 padding使用:{padding:上 右 ...
- layer弹出框插件参数及方法介绍
layerui下载:http://www.layui.com 更多参数请阅读开发文档:http://www.layui.com/doc/modules/layer.html Layui 是一款采用自身 ...
- 三解炸弹人——DFS
原创 枚举解炸弹人—— https://www.cnblogs.com/chiweiming/p/9295262.html BFS解炸弹人—— https://www.cnblogs.com/chiw ...
- 再解炸弹人——BFS
原创 之前用了枚举法解炸弹人,题目详情请看我之前的博客:https://www.cnblogs.com/chiweiming/p/9295262.html 利用枚举法是无视地图布局的,枚举法直接全局搜 ...