更改多维数组的字符编码

问题描述 投票:7回答:2

我有一个多维数组,看起来像这样:

ourThing = array(
    'id' => 1,
    'title' => 'foo',
    'data' => array(
        'name' => 'bar',
        'metadata' => array(
            'time' => '2011-02-01 12:00:00'
        )
    )
);

现在,因为我必须在它们上使用json_encodejson_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);
php
2个回答
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;
}

或者您可以通过引用传入数组,但我更喜欢这个。


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'); });
© www.soinside.com 2019 - 2024. All rights reserved.