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 其他格式数据与数组互转的更多相关文章

  1. xml格式数据和数组数据互相转换

    数组转换成xml数据 <?php $arr=array( 'username'=>'huahua', 'password'=>'123456', 'number'=>'1588 ...

  2. fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map

    作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...

  3. 一个简单xml数据转换为数组的方法

    本人用easywechat做微信回复图文,从数据库中拿到的数据直接是xml拼好的数据,但是框架只有自带的获取xml格式的语句,所有需要将xml数据中所需要的数据拿出来用来拼接. 搜了好多资料说的都很麻 ...

  4. iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? ...

  5. 解析json格式数据

    实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...

  6. 使用C#中JavaScriptSerializer类将对象转换为Json格式数据

    将对象转换为json格式字符串: private JavaScriptSerializer serializer = new JavaScriptSerializer(); protected voi ...

  7. 使用getJSON()方法异步加载JSON格式数据

    使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数组,并对获取的数据进行解析,显示在页面中,它的调用格式为: jQuery. ...

  8. Android读取JSON格式数据

    Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...

  9. 使用基于Android网络通信的OkHttp库实现Get和Post方式简单操作服务器JSON格式数据

     目录 前言 1 Get方式和Post方式接口说明 2 OkHttp库简单介绍及环境配置 3 具体实现 前言 本文具体实现思路和大部分代码参考自<第一行代码>第2版,作者:郭霖:但是文中讲 ...

随机推荐

  1. Oracle树查询,start with connect by prior 递归查询用法(转载)

    本人觉得这个写的真不错,实用性强,就转载过来了 这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点. 先看原始数据: 1 create tabl ...

  2. css二阴影+第三维度z-index

    <span style="text-shadow: 3px 3px 1px #888;">shadowed</span><span style=&qu ...

  3. IFM设备 Linux方面资料

    Github: https://github.com/lovepark/ifm3d

  4. jdbc中Statement和PreparedStatement有什么区别?哪个性能更好?

    Statement和PreparedStatement的功能主要是对sql语句的执行 区别 (1)Statement每执行一条sql语句就需要生成一条执行计划,执行100条就需要100条执行计划Pre ...

  5. 10、差异基因topGO富集

    参考:http://www.biotrainee.com/thread-558-1-1.html http://bioconductor.org/packages/3.7/bioc/ http://w ...

  6. Luogu 4784 [BalticOI 2016 Day2]城市

    斯坦纳树复习,我暑假的时候好像写过[JLOI2015]管道连接来着. 设$f_{i, s}$表示以$i$为根,$k$个重要点的连通状态为$s$,($0$代表没有连进最小生成树里面去,$1$代表连进了最 ...

  7. Ref 和out

    out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字.例如 ...

  8. 设计模式01: Singleton 单例模式(创建型模式)

    Singleton 单例模式(创建型模式) 动机(Motivation)当进行软件开发是会有这样一种需求:在系统中只有存在一个实例才能确保它们的逻辑正确性.以及良好的效率.这应该是类设计者的责任,而不 ...

  9. 【Head First Java 读书笔记】(五)编写程序

    第五章 编写程序 伪码:伪码能帮你专注于逻辑而不需要顾虑到程序语法 测试码:测试用的程序代码 真实码:实际代码 伪码 伪码是介于真正的java程序与正常英语之间的一种语言.伪码大致包括3部分:实例变量 ...

  10. Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...