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版,作者:郭霖:但是文中讲 ...
随机推荐
- C/C++代码覆盖率工具gcov、lcov
gcov是一个可用于C/C++的代码覆盖工具,是gcc的内建工具.下面介绍一下如何利用gcov来收集代码覆盖信息. 想要用gcov收集代码覆盖信息,需要在gcc编译代码的时候加上这2个选项 “-fpr ...
- Django-----restframework图解
- jquery 遮罩层指定位置
.css .datagrid-mask-msg { position: absolute; top: %; margin-top: -20px; padding: 12px 5px 10px 30px ...
- 使用Adobe Illustrator + ArcGIS绘制地图 | Map Design Using ArcGIS + Adobe Illustrator
国内GIS/Cartography同行大部分使用CorelDraw绘制地图.相比之下,国外同行则更多使用Adobe Illustrator绘制地图.CorelDraw和Illustrator两个软件均 ...
- 编写高质量代码改善C#程序的157个建议——建议45:为泛型类型参数指定逆变
建议45:为泛型类型参数指定逆变 逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类.FCL4.0中支持逆变的常用委托有: Func<int T,out TResult> Predi ...
- 凑算式——第七届蓝桥杯C语言B组(省赛)第三题
原创 凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的 ...
- 生日蜡烛——第七届蓝桥杯C语言B组(省赛)第二题
原创 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始过生日 ...
- AD对象DirectoryEntry本地开发
DirectoryEntry类如果需要在本地计算机开发需要满足以下条件: 1.本地计算机dns解析必须和AD域控制器的dns保持一致,如图: 2.必须模拟身份验证,才能操作查询AD用户 /// < ...
- CentOS 系统管理与yum软件仓库搭建
重启 reboot shutdown -r now init 6 关闭 init 0 shutdown -h now shutdown -h 20:25 #8点25关机查看内存 free CPU利用率 ...
- EFCore扩展Select方法(根据实体定制查询语句)
EFCore扩展Select方法(根据实体定制查询语句) 通常用操作数据库的时候查询返回的字段是跟 我们的定义的实体是不一致的,所以往往针对UI或者接口层创建大量的Model, 而且需要手动对应字段 ...