php的iconv函数只支持对字符串的转换编码,如果是数组,就要自己遍历转换了,因此写如上的函数,对任意维数组进行转换,同时转换下标(索引)及值。
注意:不转对象。
function mult_iconv($in_charset,$out_charset,$data) { if(substr($out_charset,-8)=='//IGNORE'){ $out_charset=substr($out_charset,0,-8); } if(is_array($data)){ foreach($data as $key => $value){ if(is_array($value)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); $rtn[$key]=mult_iconv($in_charset,$out_charset,$value); }elseif(is_string($key) || is_string($value)){ if(is_string($key)){ $key=iconv($in_charset,$out_charset.'//IGNORE',$key); } if(is_string($value)){ $value=iconv($in_charset,$out_charset.'//IGNORE',$value); } $rtn[$key]=$value; }else{ $rtn[$key]=$value; } } }elseif(is_string($data)){ $rtn=iconv($in_charset,$out_charset.'//IGNORE',$data); }else{ $rtn=$data; } return $rtn; }
调用示例:
$foobar=mult_iconv('gbk','utf-8','一个数组、字符串或其它类型数据');
一个复杂一点的测试示例(不转对象)
// ******* 一个复杂一点的测试示例 ******************** class MyClass { public $v1='不转对象,恭喜发财'; public $v2='skipped object'; public function f() { return true; } } $obj=new MyClass(); $foo=array('abcd','随便写点文字' ,array('中文下标'=> 789,'天地玄黄' =>array('宇宙洪荒'=>'赵钱孙李',300=>'恭喜发财,不转对象' ,array('更深的数组'=>'照样可以转换') ) ) ,'恭喜发财,不转对象' => $obj ,'如需转对象'=>'Do It Yourself!' ,'作者很懒'=>'用不到就不写了' ); $bar=mult_iconv('gbk','utf-8//IGNORE',$foo); var_dump($bar);