我有一个多维数组,看起来像这样:
ourThing = array(
'id' => 1,
'title' => 'foo',
'data' => array(
'name' => 'bar',
'metadata' => array(
'time' => '2011-02-01 12:00:00'
)
)
);
现在,因为我必须对它们使用json_encode
和json_decode
,所以我需要将data
中的内容至少存储为UTF-8。不幸的是,该网站使用的是Windows-1252,这是我无法改变的。因为我可能希望将来在数组中添加更多级别(在数据内),我想我会递归地改变编码,如下所示:
function encode_items($arr) {
foreach ($arr as $n => $v) {
if (is_array($v))
encode_items($arr[$n]);
else
$arr[$n] = mb_convert_encoding($v, 'Windows-1252', 'UTF-8');
}
}
但是,这不起作用。如果我在编码后立即打印$ arr [$ n],它就会出现,但原始数组似乎没有改变,因为当我稍后尝试从数组中打印出值时,我会遇到字符编码问题。
tl; dr:我需要将ourThing['data']
中信息的编码从utf-8更改为windows-1252。
如何更改原始数组?
编辑:感谢有用的评论者,我现在知道我做错了什么。我忘了在进行编码后实际返回数组。这是一个有效的例子:ourArray = array(
'id' => 1,
'title' => 'foo',
'data' => array(
'name' => 'bar',
'metadata' => array(
'time' => '2011-02-01 12:00:00'
)
)
);
function encode_items($arr) {
foreach ($arr as $n => $v) {
if (is_array($v)) {
$arr[$n] = encode_items($v);
} else {
$arr[$n] = mb_convert_encoding($v, 'Windows-1252', 'UTF-8');
}
}
return $arr;
}
$ourArray = encode_items($ourArray);
答案 0 :(得分:13)
这个怎么样:
function myEncodeFunction(&$item)
{
$item = mb_convert_encoding($item, 'Windows-1252', 'UTF-8');
}
array_walk_recursive($ourThing, 'myEncodeFunction');
甚至把它变成一个单行:
array_walk_recursive($ourThing, function(&$item) { $item = mb_convert_encoding($item, 'Windows-1252', 'UTF-8'); });
答案 1 :(得分:9)
: - )
function encode_items($array)
{
foreach($array as $key => $value)
{
if(is_array($value))
{
$array[$key] = encode_items($value);
}
else
{
$array[$key] = mb_convert_encoding($value, 'Windows-1252', 'UTF-8');
}
}
return $array;
}
或者你可以通过引用传入数组,但我更喜欢这个。