Intereting Posts
Как работает memcache с MySQL? PHP автоматически убивает скрипт, если HTTP-запрос отменен / закрыт проблемы с профилями страницы в системе, которые всегда отображают, что пользователь является владельцем профиля, который является неправильным Подключение к базе данных MySQL MySQL из локального хоста Удалить данные EXIF ​​из JPG с помощью PHP Каков самый простой способ получить число из URL-адреса? Получите реальный профиль изображения в Facebook Symfony2, Как изменить среду? Как выбрать все элементы, чей идентификатор содержит определенную подстроку? Ошибка создания Composer-проекта в локальном репозитории пакетов Каков наилучший способ скрыть файл на сервере? Ссылка на статический шаблон в symfony2 PHP заменяет строку со значениями из массива Базовый стол или вид не найдены: 1146 Таблица Laravel 5 Является ли неправильная практика делать запрос Ajax непосредственно из плагина jQuery?

Изменение кодировки символов многомерного массива

У меня многомерный массив, который выглядит примерно так:

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

Solutions Collecting From Web of "Изменение кодировки символов многомерного массива"

🙂

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