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);
延伸阅读coded by nessus