php 其他格式数据与数组互转
生活随笔
收集整理的這篇文章主要介紹了
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-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 其他格式数据与数组互转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git提交项目到GitHub
- 下一篇: Spark MLlib 机器学习