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版,作者:郭霖:但是文中讲 ...
随机推荐
- Python中sort与sorted函数
python中列表的内置函数sort()可以对列表中的元素进行排序,而全局性的sorted()函数则对所有可迭代的序列都是适用的: 并且sort()函数是内置函数,会改变当前对象,而sorted()函 ...
- Linux下DNS配置
一.本机DNS配置 参考:http://blog.sina.com.cn/s/blog_68d6e9550100k3b7.html 二.DNS服务器搭建 http://toutiao.com/i631 ...
- Linux PulseAudio
一.简介 Linux的声音系统或许是最无序的子系统部分!作为Server来说,声音无足轻重,无人问津,而作为桌面来说太多的实现方案,各有各的长出和不足,ALSA经过多年的发展,基本统一了Linux声卡 ...
- python 将字符串转化为可执行代码
场景: 在一个遍历的的程序中,有一步需要调用函数,调用的方式是根据输入参数,从3个可供被调用的函数中,选择其中一个.所以写了一个dict={1:"function_a_name", ...
- Android不间断上报位置信息-应用进程防杀指南
没用的 除非加入白名单 或者用户自己设置锁屏后不被杀死 不然的话 锁屏5分钟以内app会被杀死,包 括所有的service. 说白了就是定位不要纯依赖gps,很多硬件为了省电,会对熄屏下的模块功能和运 ...
- Cookie的跨域问题
被误解的HttpCookie.Domain属性 有人说可以利用HttpCookie.Domain属性实现跨域访问,假如在A站(A.com)中写B站(B.com)的cookie,如下所示 这其实是错误的 ...
- 编写高质量代码改善C#程序的157个建议——建议12: 重写Equals时也要重写GetHashCode
建议12: 重写Equals时也要重写GetHashCode 除非考虑到自定义类型会被用作基于散列的集合的键值:否则,不建议重写Equals方法,因为这会带来一系列的问题. 如果编译上一个建议中的Pe ...
- 如何恢复VS2013代码实时校验功能
VS2013在某一天突然无法进行实时代码校验了,只有在编译的时候,错误列表才显示语法错误 怎么来解决这个问题呢?试试环境重置吧. 首先:打开工具菜单,选择“导入和导出设置”. 其次:可以先导出选定 ...
- mongodb数据库学习【安装及简单增删改查】
//@desn:mongodb数据库学习 //@desn:码字不宜,转载请注明出处 //@author:张慧源 <turing_zhy@163.com> //@date:2018/08/ ...
- java jeesite.properties配置文件属性提取
package com.thinkgem.jeesite.common.config; import java.io.UnsupportedEncodingException; import java ...