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-8elsereturn 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

php 其他格式数据与数组互转相关推荐

  1. 常用数据类型和bytes数组互转

    常用数据类型和bytes数组互转 简介 常用于tcp和udp传输,通过约定协议进行数据交互 示例 1.在Python中一般用struct库进行常见的转换,主要对数字进行处理,包括int.float等 ...

  2. hive中存Array类型的数据的案例,将字符串的数组格式转成数组的字符串,自定义函数方式处理‘[12,23,23,34]‘字符串格式的数据为array<int>格式的数据。

    1.创建表带有Array的表: create table t_afan_test ( info1 array<int>, info2 array<string> ) ROW F ...

  3. python生成json_如何将Python数组转为Json格式数据并存储?

    在Python中将数组转为Json数据存储时需要用到将json模块中的json.dumps()或者json.dump()方法. ·json.dumps()方法用法 使用json.dumps( )方法将 ...

  4. JavaScript数组格式的数据转换为json格式数据

    vue + JavaScript 把数组格式的数据转换为json格式数据 <!DOCTYPE html> <html lang="en"><head& ...

  5. vue表单校验json数组格式和普通数组格式数据

    1.效果图 说明:3种动作,对应3种验证规则,动作1:数字对象或数组均可(空也可):动作2:只有数组对象可通过验证:动作3:数字类型可通过验证 2.代码实现 (1)template(注意这里的循环数据 ...

  6. php处理微信返回xml数据,php将微信返回的xml格式转换成数组

    废话不多说直接上代码 代码<?php header("Content-type: text/html; charset=utf-8"); date_default_timez ...

  7. OpenCV实现Mat与vector,Mat与数组互转

    OpenCV实现Mat与vector互转 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/80253066 1.Mat与v ...

  8. avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转

    背景 最近在研究C#进行图像处理,在图像处理中算法中,往往都是针对的是矩阵运算的.矩阵其实就是一个二维的数组. 为了图像处理的速度,我们都需要放在内存中处理.但网络上收集的代码,往往都是以一维数组的样 ...

  9. 使用PHP生成和获取XML格式数据

    生成XML格式数据 假设系统中有一张学生信息表student,需要提供给第三方调用,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. CREATE TABLE 'student ...

最新文章

  1. Gut:人体口腔菌群的稳定性和动态变化规律
  2. 用FFT求信号相位谱
  3. oracle sql语句中包含‘’ 的解决方法
  4. 文巾解题 994. 腐烂的橘子
  5. Python初学者之ImportError: No module named moviepy.editor 的解决办法
  6. 有关日志打印的几点经验
  7. 步步深入MySQL:架构-查询执行流程-SQL解析顺序
  8. java中一个线程最小优先数_Java线程的优先级
  9. mount.nfs: Stale file handle的解决方法
  10. C++之STL种类及实现
  11. ffmpeg录制麦克风声音和pc内部声音(如播放歌曲)---混音--修正
  12. PC端用Itunes备份Iphone时修改备份路径的办法
  13. 隐藏微信右上角的分享按钮
  14. 【opencv】支付宝AR实景红包领取方法
  15. origin画图_Origin作图过程中如何让图看起来更生动
  16. 利用apktool查看apk源代码
  17. Java学习总结第一阶段
  18. 2021年黄石二中高考成绩查询,黄石二中2019高考喜报成绩、一本二本上线人数情况...
  19. ZBrush中的笔触
  20. Vue引入百度地图警告:A Parser-blocking, cross site (i.e. different eTLD+1) script....

热门文章

  1. c3p0数据库连接池+mysql数据库基本使用方法
  2. hdu 1016 Prime Ring Problem(DFS)
  3. Web项目开发性能优化解决方案
  4. JS中自定义replace可替换特殊符号$等,但无法忽略大小写的函数
  5. 【算法导论】学习笔记——第11章 散列表
  6. 好久没写了,重装了系统重新配置的Live Writer,看看效果:
  7. 掌握Node.js中的Async和Await
  8. 国家“十三五”重点出版规划获批
  9. Gamma校正及其OpenCV实现
  10. mysql show status