Ändern der Zeichenverschlüsselung der mehrdimensionalen array

Ich habe ein mehrdimensionales array, dass wie folgt aussieht:

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

Nun, da ich json_encode und json_decode auf, in dem ich Sie speichern müssen zumindest die Sachen, die in data als UTF-8. Leider, die website verwendet, windows-1252, und das ist etwas, was ich nicht ändern kann. Da möchte ich vielleicht noch mehr-Ebenen, um das array (in-Daten) in die Zukunft, ich dachte, ich würde ändern Sie die Codierung an, die rekursiv, wie folgt:

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');
    }
}

Dies ist jedoch nicht arbeiten. Wenn ich print $arr[$n] rechts, nach der Enkodierung, es geht, aber das original-array scheint nicht zu ändern, denn wenn ich später versuchen, drucken Sie die Werte aus dem array, bekomme ich die character-encoding-Probleme.

tl;dr: ich brauche eine änderung der Kodierung der Informationen in ourThing['data'] von utf-8 auf windows-1252.

Wie kann ich es so machen, dass das ursprüngliche array wird verändert?

EDIT: Dank an einen hilfreichen Kommentator, ich weiß jetzt, was ich falsch machte. Ich vergaß tatsächlich die Rückkehr das array nach der Codierung. Hier ist ein Beispiel:

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);
  • Ihnen fehlt ein $ im foreach ($arr as $n => ___v) {
  • Oops. Typo. Ist jetzt behoben.
  • Vielleicht Rückkehr das array wäre eine solide verschieben!
  • Oh wow... ich habe schon viel zu lange. Ja. Ich höre tatsächlich wieder etwas von Ihr Funktionen hilft. Wenn Sie uns das als Antwort, ich werde schändlich akzeptieren.
  • Können wir fassen das Problem als 'der oben genannten Funktion wirkt sich nicht auf das original-array'? Machen verwenden von array-Referenzen statt mit der et-Zeichen "anmelden", d.h. &$arr
InformationsquelleAutor Tommy Brunn | 2012-02-01
Schreibe einen Kommentar