Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2010, 22:30   #1
kpachbiu
взагрузке.рф
Форумчанин
 
Аватар для kpachbiu
 
Регистрация: 13.06.2010
Сообщений: 117
Радость Преобразование массива

Здравствуйте!
Помогите найти решение -преобразовать многомерный массив в одномерный и поменять его кодировку из UTF-8 в win-1251

Вот пример массива (полей uid,last_name и прочее может быть разное количество)

Array ( [response] => Array ( [0] => Array ( [uid] => 1927834 [first_name] => Константин [last_name] => Николаев [sex] => 2 [city] => 2 [bdate] => 30.8.1988 [photo] => http://cs383.vkontakte.ru/u1927834/c_20a16d8e.jpg ) ) )

Как из этого массива сделать одномерный?
Чтобы обращаться к элементам как $m[first_name], а не $m[response][0][first_name]
Взагрузке.рф - Файлы для людей
Ищу художника или веб-дизайнера для создания браузерной онлайн игры! icq 340-289-851
kpachbiu вне форума Ответить с цитированием
Старый 05.10.2010, 00:23   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Попробуйте это сделать с помощью прохода по массиву с помощью for each и присвоения элементам нового массива текущего значения, а кодировку меняете с помощью mb_convert_encoding
motorway вне форума Ответить с цитированием
Старый 05.10.2010, 23:46   #3
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

mb_convert_encoding не работает с массивами, а только со строками.

kpachbiu
Я, конечно, скажу глупость, но - $m = $m[response][0]; - и у вас одномерный массив.

Насколько я понимаю, данный массив получается из базы данных. Вот, чтобы таких вопросов не было, запросы к БД нужно писать правильно, и тогда не будет лишнего мусорного кода.
Во-первых, получать данные из БД нужно сразу в utf-8. Я даже больше скажу, их хранить нужно в utf-8.
Во-вторых, получать одну строку из таблицы многомерным массивом и конвертировать её через "тридевять земель" в одномерный массив - плохой тон. Есть такие замечательные функции как mysql_fetch_assoc, mysql_fetch_array и т.д.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 06.10.2010, 20:31   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Цитата:
mb_convert_encoding не работает с массивами, а только со строками.
я и не предлагал работать с массивами - если уже есть преобразованная строка (элемент массива), то можно применить к нему эту функцию
motorway вне форума Ответить с цитированием
Старый 06.10.2010, 23:29   #5
kpachbiu
взагрузке.рф
Форумчанин
 
Аватар для kpachbiu
 
Регистрация: 13.06.2010
Сообщений: 117
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
mb_convert_encoding не работает с массивами, а только со строками.

kpachbiu
Я, конечно, скажу глупость, но - $m = $m[response][0]; - и у вас одномерный массив.

Насколько я понимаю, данный массив получается из базы данных. Вот, чтобы таких вопросов не было, запросы к БД нужно писать правильно, и тогда не будет лишнего мусорного кода.
Во-первых, получать данные из БД нужно сразу в utf-8. Я даже больше скажу, их хранить нужно в utf-8.
Во-вторых, получать одну строку из таблицы многомерным массивом и конвертировать её через "тридевять земель" в одномерный массив - плохой тон. Есть такие замечательные функции как mysql_fetch_assoc, mysql_fetch_array и т.д.
Дело в том что я использую Open API vkontakte!
Я посылаю запрос мне их сервер присылает ответ в виде строчки:

Array ( [response] => Array ( [0] => Array ( [uid] => 1927834 [first_name] => Константин [last_name] => Николаев [sex] => 2 [city] => 2 [bdate] => 30.8.1988 [photo] => http://cs383.vkontakte.ru/u1927834/c_20a16d8e.jpg ) ) )

Вот я и хотел встроить в обработчик (класс для работы с vkontatke API) упрощение (преобразование в одномерный массив и смена кодировки из UTF-8 в win-1251)

Вот класс обработчик vkapi.class.php

PHP код:
<?php

/**
 * VKAPI class for vk.com social network
 *
 * @package server API methods
 * @link http://vk.com/developers.php
 * @autor Oleg Illarionov
 * @version 1.0
 */
 
class vkapi {
    var 
$api_secret;
    var 
$app_id;
    var 
$api_url;
    
    function 
vkapi($app_id$api_secret$api_url 'api.vkontakte.ru/api.php') {
        
$this->app_id $app_id;
        
$this->api_secret $api_secret;
        if (!
strstr($api_url'http://')) $api_url 'http://'.$api_url;
        
$this->api_url $api_url;
    }
    
    function 
api($method,$params=false) {
        if (!
$params$params = array(); 
        
$params['api_id'] = $this->app_id;
        
$params['v'] = '3.0';
        
$params['method'] = $method;
        
$params['timestamp'] = time();
        
$params['format'] = 'json';
        
$params['random'] = rand(0,10000);
        
ksort($params);
        
$sig '';
        foreach(
$params as $k=>$v) {
            
$sig .= $k.'='.$v;
        } 
//die($sig); //отладка запросов
        
$sig .= $this->api_secret;
        
$params['sig'] = md5($sig);
        
$query $this->api_url.'?'.$this->params($params);
        
$res file_get_contents($query);
        return 
json_decode($restrue);
    }
    
    function 
params($params) {
        
$pice = array();
        foreach(
$params as $k=>$v) {
            
$pice[] = $k.'='.urlencode($v);
        }
        return 
implode('&',$pice);
    }
}
?>

Может быть есть идеи?
Взагрузке.рф - Файлы для людей
Ищу художника или веб-дизайнера для создания браузерной онлайн игры! icq 340-289-851
kpachbiu вне форума Ответить с цитированием
Старый 07.10.2010, 00:22   #6
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Ну вот вручную и присвойте новым переменным значения каждого элемента.
motorway вне форума Ответить с цитированием
Старый 07.10.2010, 02:36   #7
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Подход неправильный, но всё-таки, попробуйте вместо строки return json_decode($res, true); поставить return json_decode(iconv('windows-1251', 'utf-8', $res), true);

Это я спросоня придумал. ) Завтра точно ужаснусь такому.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 07.10.2010, 05:18   #8
arvitaly
Пользователь
 
Аватар для arvitaly
 
Регистрация: 01.08.2010
Сообщений: 51
По умолчанию

Код:
Это я спросоня придумал. ) Завтра точно ужаснусь такому.
Да нет, нормально все, json_decode принимает на вход строку, почему бы перед этим ее не перекодировать.
arvitaly вне форума Ответить с цитированием
Старый 07.10.2010, 14:10   #9
kpachbiu
взагрузке.рф
Форумчанин
 
Аватар для kpachbiu
 
Регистрация: 13.06.2010
Сообщений: 117
Радость

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Подход неправильный, но всё-таки, попробуйте вместо строки return json_decode($res, true); поставить return json_decode(iconv('windows-1251', 'utf-8', $res), true);

Это я спросоня придумал. ) Завтра точно ужаснусь такому.
Спасибо!
json_decode(iconv('utf-8', 'windows-1251', $res), true);
Дает на выходе пустой результат!
Наверно потому что сама функция json_decode работает только с данными в кодировке UTF-8

В общем тогда получается буду делать весь сайт в кодировке UTF-8
и проблема решена!

Остается только преобразовать многомерный массив в одномерный?!
Взагрузке.рф - Файлы для людей
Ищу художника или веб-дизайнера для создания браузерной онлайн игры! icq 340-289-851
kpachbiu вне форума Ответить с цитированием
Старый 07.10.2010, 15:36   #10
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

А вы пробовали мой способ?
motorway вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование двумерного массива в одномерный... S.Mihail Паскаль, Turbo Pascal, PascalABC.NET 5 09.12.2011 19:24
Преобразование массива в паскале street_spirit Помощь студентам 9 05.10.2010 19:08
Преобразование массива с++ davart Помощь студентам 3 01.10.2010 09:25
преобразование массива PARTOS Microsoft Office Excel 4 20.01.2010 17:21