У меня многомерный массив, который выглядит примерно так:
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.
Как я могу сделать так, чтобы исходный массив был изменен?
EDIT: Благодаря полезному комментатору я теперь знаю, что я делаю неправильно. Я забыл вернуть массив после выполнения кодировки. Вот рабочий пример:
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);
🙂
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; }
Или вы можете передать массив по ссылке, но я предпочитаю это.
Как насчет этого:
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'); });