更改多维数组的字符编码

Tom*_*unn 8 php

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

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

现在,因为我不得不使用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');
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.如果我在编码后立即打印$ 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);
Run Code Online (Sandbox Code Playgroud)

Tra*_*ty3 15

这个怎么样:

function myEncodeFunction(&$item)
{
    $item = mb_convert_encoding($item, 'Windows-1252', 'UTF-8');
}

array_walk_recursive($ourThing, 'myEncodeFunction');
Run Code Online (Sandbox Code Playgroud)

甚至把它变成一个单行:

array_walk_recursive($ourThing, function(&$item) { $item = mb_convert_encoding($item, 'Windows-1252', 'UTF-8'); });
Run Code Online (Sandbox Code Playgroud)


Pau*_*man 10

:-)

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;
}
Run Code Online (Sandbox Code Playgroud)

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