X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> "Нулевое" преобразование типов
PRStudio
PRStudio
Topic Starter сообщение 22.6.2011, 20:58; Ответить: PRStudio
Сообщение #1


Опишу суть проблемы:
Существует некий сторонний XML файл, с которого я беру информацию. Я подгружаю этот файл, меняю кодировку с UTF-8 на cp1251 (иначе появляются "кракозябры"), далее вырезаю нужную мне информацию. Предположим, я вырезал некое число "2.2", оно хранится как строковое, теперь если я попробую его округлить, выведет ноль. Далее я пытался преобразовать строку в число с плавающей точкой (double) несколькими способами (привожу альтернативный код для примера):
[PHP]$val = "2.2";
$val = (double)$val;[/PHP]
и
[PHP]$val = "2.2";
$val = settype($val,double);[/PHP]
и
[PHP]$val = "2.2";
$val = doubleval($val);[/PHP]

но все равно, выдает ноль.
Я проверял исходное число и его тип, число равно (к примеру) 2.2, тип функцией gettype() - string.

Далее я еще экспериментировал с приведением типов, максимум мне довелось перевести переменную в булеан, хотя переводил я ее в интежер и получил единицу :)

Собственно вот пример кода:
[PHP]$parse_prec_3 = ParseInfoWeather(2,'precipitation'); // Функция ParseInfoWeather() режет XML на куски и выделяет нужный мне блок "precipitation", который содержит число, к примеру 2.2
$parse_prec_3 = doubleval($parse_prec_3);[/PHP]

Т.е. нужно каким-то образом без потери исходных данных преобразовать строку в число с плавающей точкой, для дальнейшей работы с ним.

Подскажите в чем загвоздка
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
NiKON_hb
NiKON_hb
сообщение 22.6.2011, 22:44; Ответить: NiKON_hb
Сообщение #2


[PHP]
$val = "2.2";
echo gettype($val); //string
$val = $val * 1;
echo gettype($val); //double
[/PHP]
Вот так например.
Даже проверил.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
PRStudio
PRStudio
Topic Starter сообщение 23.6.2011, 0:01; Ответить: PRStudio
Сообщение #3


Спасибо, это действительно будет работать, но только не у меня :) Вся "фишка" в том, что тип изменяется, но данные из переменной превратятся в ноль. Хотя на вашем примере все будет работать отлично, а php еще и сам автоматом тип нужный подставит. В моем же случае такое почему-то не работает (на примере работы функции парсинга). Я буре блок из XML, режу его, выгребаю число, но не могу с ним ничего сделать, для меня это бесполезная строка, которую не округлишь и ни с чем не сравнишь.

Вот собственно сырой "парсер". Он производит парсинг текущей погоды из GET запроса с именем id. ID должен быть существующим на rp5.by. Я для тестов использую 31. Т.е. ссылка на XML имеет такой вид: http://rp5.by/xml/31/ru
Для вызова необходимо запустить ссылку вида: данный_скрипт.php?id=31 и чуть не забыл, не забудьте (кто решиться помочь) вызвать функцию PrintWeather();

Исходник:
[PHP]<?php

// Недоделанный масив с городами
$weather_infos = array(
"31" => "Витебск",
"orsha" => "44",
"polotsk" => "",
"novopolotsk" => "",
"glubokoe" => ""
);

// Для уменьшения времени загрузки делаем презагрузку XML
if ($_GET['id'] != null){
$parse_info = file_get_contents("http://rp5.by/xml/".$_GET['id']."/ru"); // Получаем содержание XML
$parse_cp1251=iconv('utf-8','cp1251',$parse_info); // Меняем кодировку
}

function ParseWeather(){
GLOBAL $parse_cp1251 ;
//$region = $_GET['id']; // Пока нигде не используется


// Получить все блоки сводок
preg_match_all ("!<timestep>(.*?)</timestep>!sei", $parse_cp1251, $timesteps);

// $timesteps[0][0] - первый блок
// $timesteps[0][1] - второй блок
// $timesteps[0][2] - третий блок
// $timesteps[0][3] - четвертый блок

return $timesteps;
}

function ParseInfoWeather($num,$type){

$perv_info_array = ParseWeather(); // Загружаем все блоки в переменную
$perv_info = $perv_info_array[0][$num]; // Выгребаем нужный блок (их всего 4)

// Начинаем парсить информацию из XML

// Parse HHii
preg_match("!<HHii>(.*?)</HHii>!sei",$perv_info,$HHii); // Время прогноза
// Parse datetime
preg_match("!<datetime>(.*?)</datetime>!sei",$perv_info,$datetime); // Полная дата пика прогноза
// Parse precipitation
preg_match("!<precipitation>(.*?)</precipitation>!sei",$perv_info,$precipitation); // Осадки
// Parse cloud_cover
preg_match("!<cloud_cover>(.*?)</cloud_cover>!sei",$perv_info,$cloud_cover); // Облачность
// Parse pressure
preg_match("!<pressure>(.*?)</pressure>!sei",$perv_info,$pressure); // Давление
// Parse temperature
preg_match("!<temperature>(.*?)</temperature>!sei",$perv_info,$temperature); // Температура
// Parse humidity
preg_match("!<humidity>(.*?)</humidity>!sei",$perv_info,$humidity); // влажность
// Parse wind_direction
preg_match("!<wind_direction>(.*?)</wind_direction>!sei",$perv_info,$wind_direction); // Направление ветра
// Parse wind_velocity
preg_match("!<wind_velocity>(.*?)</wind_velocity>!sei",$perv_info,$wind_velocity); // Скорость ветра
// Parse falls
preg_match("!<falls>(.*?)</falls>!sei",$perv_info,$falls); // Тип осадков
// Parse drops
preg_match("!<drops>(.*?)</drops>!sei",$perv_info,$drops); // Соотношение осадков

// Мне не нужно время, оно уже есть, обрезаю и беру дату пика
$datetime_print = explode(" ",$datetime[0]);
$datetime_print = $datetime_print[0];


// Организую централизированные запросы к функции для удобства вызова нужной информации
switch ($type){
case 'HHii':$return = $HHii[0];
break;
case 'datetime':$return = $datetime_print;
break;
case 'precipitation':$return = $precipitation[0];
break;
case 'cloud_cover':$return = $cloud_cover[0];
break;
case 'pressure':$return = $pressure[0];
break;
case 'temperature':$return = $temperature[0];
break;
case 'humidity':$return = $humidity[0];
break;
case 'wind_direction':$return = $wind_direction[0];
break;
case 'wind_velocity':$return = $wind_velocity[0];
break;
case 'falls':$return = $falls[0];
break;
case 'drops':$return = $drops[0];
break;
}

return $return;


}

// Вывод картинки на экран (солнышко, дождик и т.п., функция бесполезна без изменения типа исходных данных)
function pofanWeatherImage($id){
$time = ParseInfoWeather($id,'HHii');
$wind_dir = ParseInfoWeather($id,'wind_direction');
$wind_vel = ParseInfoWeather($id,'wind_velocity'); // Злаполучная переменная, должна быть float
$cloud_cover = ParseInfoWeather($id,'cloud_cover'); // Злаполучная переменная, должна быть float
$drops = ParseInfoWeather($id,'drops'); // Злаполучная переменная, должна быть float
$falls = ParseInfoWeather($id,'falls'); // Злаполучная переменная, должна быть int

// Массив возможных изображений (сырой)
$images = array(
"sun_full_5" => "sunny.png",
"sun_10" => "cloudy1.png",
"sun_20" => "cloudy2.png",
"sun_30" => "cloudy3.png",
"sun_40" => "cloudy4.png",
"sun_50" => "cloudy5.png",
"rain_n_snow" => "sleet.png",
"rain_0" => "shower1.png",
"rain_4" => "shower2.png",
"rain_6" => "shower3.png"
);

// Следующий код бесполезен, пока не изменятся типы данных, следующий код не работает (работает неверно)
if ($falls == 0 && $cloud_cover >= 0 && $cloud_cover <= 5){
$return = $images['sun_full_5'];
}
if ($falls == 0 && $cloud_cover >5 && $cloud_cover <=10){
$return = $images['sun_10'];
}
if ($falls == 0 && $cloud_cover >10 && $cloud_cover <=20 ){
$return = $images['sun_20'];
}
if ($falls == 0 && $cloud_cover >20 && $cloud_cover <=30 ){
$return = $images['sun_30'];
}
if ($falls == 0 && $cloud_cover >30 && $cloud_cover <=40 ){
$return = $images['sun_40'];
}
if ($falls == 0 && $cloud_cover >40){
$return = $images['sun_50'];
}
return $return;
}


// Выводим погоду на экран
function PrintWeather(){

// Следующие переменные должны быть округлены, но они не округляются и принимают нули, но исходные нули не все (все зависит от сводок погоды, но обычно есть число больше 1 - 2), но у нас, оно будет ноль, ибо тип данных не изменяется
// Все данные при попытке изменения типа обнуляются :(
$parse_prec_1 = ParseInfoWeather(0,'precipitation');
$parse_prec_1 = (float)$parse_prec_1;
$parse_prec_1 = round($parse_prec_1);


$parse_prec_2 = ParseInfoWeather(1,'precipitation');
$parse_prec_2 = (float)$parse_prec_2;
$parse_prec_2 = round($parse_prec_2);

$parse_prec_3 = ParseInfoWeather(2,'precipitation');
$parse_prec_3 = (float)$parse_prec_3*1;
$parse_prec_3 = round($parse_prec_3);


$parse_prec_4 = ParseInfoWeather(3,'precipitation');
$parse_prec_4 = (float)$parse_prec_4;
$parse_prec_4 = round($parse_prec_4);

// Формируем вывод
$return = '

<table width="550" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><div align="left"></div></td>
<td><div align="center">'.ParseInfoWeather(0,'datetime').'</div></td>
<td><div align="center">'.ParseInfoWeather(1,'datetime').'</div></td>
<td><div align="center">'.ParseInfoWeather(2,'datetime').'</div></td>
<td><div align="center">'.ParseInfoWeather(3,'datetime').'</div></td>
</tr>
<tr>
<td><div align="left"></div></td>
<td><div align="center"><img src="additions/images/weather/'.pofanWeatherImage(0).'"/></div></td>
<td><div align="center"><img src="additions/images/weather/'.pofanWeatherImage(1).'"/></div></td>
<td><div align="center"><img src="additions/images/weather/'.pofanWeatherImage(2).'"/></div></td>
<td><div align="center"><img src="additions/images/weather/'.pofanWeatherImage(3).'"/></div></td>
</tr>
<tr>
<td><div align="left">Время</div></td>
<td><div align="center">'.ParseInfoWeather(0,'HHii').'</div></td>
<td><div align="center">'.ParseInfoWeather(1,'HHii').'</div></td>
<td><div align="center">'.ParseInfoWeather(2,'HHii').'</div></td>
<td><div align="center">'.ParseInfoWeather(3,'HHii').'</div></td>
</tr>
<tr>
<td><div align="left"><b>Температура</b></div></td>
<td><div align="center"><b>'.ParseInfoWeather(0,'temperature').'&deg;C</b></div></td>
<td><div align="center"><b>'.ParseInfoWeather(1,'temperature').'&deg;C</b></div></td>
<td><div align="center"><b>'.ParseInfoWeather(2,'temperature').'&deg;C</b></div></td>
<td><div align="center"><b>'.ParseInfoWeather(3,'temperature').'&deg;C</b></div></td>
</tr>
<tr>
<td><div align="left">Осадки</div></td>
<td><div align="center">'.$parse_prec_1.' мм</div></td>
<td><div align="center">'.$parse_prec_2.' мм</div></td>
<td><div align="center">'.$parse_prec_3.' мм</div></td>
<td><div align="center">'.$parse_prec_4.' мм</div></td>
</tr>
<tr>
<td><div align="left">Облачность</div></td>
<td><div align="center">'.ParseInfoWeather(0,'cloud_cover').' %</div></td>
<td><div align="center">'.ParseInfoWeather(1,'cloud_cover').' %</div></td>
<td><div align="center">'.ParseInfoWeather(2,'cloud_cover').' %</div></td>
<td><div align="center">'.ParseInfoWeather(3,'cloud_cover').' %</div></td>
</tr>
<tr>
<td><div align="left">Давление</div></td>
<td><div align="center">'.ParseInfoWeather(0,'pressure').'<br/>мм. рт.ст.</div></td>
<td><div align="center">'.ParseInfoWeather(1,'pressure').'<br/>мм. рт.ст.</div></td>
<td><div align="center">'.ParseInfoWeather(2,'pressure').'<br/>мм. рт.ст.</div></td>
<td><div align="center">'.ParseInfoWeather(3,'pressure').'<br/>мм. рт.ст.</div></td>
</tr>
<tr>
<td><div align="left">Влажность</div></td>
<td><div align="center">'.ParseInfoWeather(0,'humidity').' %</div></td>
<td><div align="center">'.ParseInfoWeather(1,'humidity').' %</div></td>
<td><div align="center">'.ParseInfoWeather(2,'humidity').' %</div></td>
<td><div align="center">'.ParseInfoWeather(3,'humidity').' %</div></td>
</tr>
<tr>
<td><div align="left">Ветер</div></td>
<td><div align="center">'.ParseInfoWeather(0,'wind_direction').'<br/>'.ParseInfoWeather(0,'wind_velocity').' м/с</div></td>
<td><div align="center">'.ParseInfoWeather(1,'wind_direction').'<br/>'.ParseInfoWeather(1,'wind_velocity').' м/с</div></td>
<td><div align="center">'.ParseInfoWeather(2,'wind_direction').'<br/>'.ParseInfoWeather(2,'wind_velocity').' м/с</div></td>
<td><div align="center">'.ParseInfoWeather(3,'wind_direction').'<br/>'.ParseInfoWeather(3,'wind_velocity').' м/с</div></td>
</tr>
<tr>
<td colspan="5" align="right"><a href="http://rp5.by/'.$_GET['id'].'/ru"><img src="additions/images/weather/rp5_logo.png"></a></td>
</tr>
</table>


';
return $return;
}
?>[/PHP]

Заранее благодарен, особенно тем кто решиться все это прочитать и вникнуть :)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 23.6.2011, 1:59; Ответить: alexdrob
Сообщение #4


http://php.net/manual/ru/function.preg-match.php
Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] - часть строки, соответствующую первой подмаске, и так далее.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 23.6.2011, 3:42; Ответить: ZhukV
Сообщение #5


А зачем тогда менять тип???
Вы сможете и так его спокойно округлить функциями rang, floor .....
В ПХП нет строгих правил типов данных, разве что для ООП.

[PHP]
$t = "1.25871";
echo gettype($t);
$t = floor($t); // Или что-то другое
[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 23.6.2011, 3:48; Ответить: ZhukV
Сообщение #6


1. Ваш парсер может давать болше нагрузки, поскольку у Вас не рациональное использования функции preg_match. Установите регулярки в блоки case.
2. Такого рода парсера лучше делать при помощи XML -- DOMElement -- http://php.net/manual/ru/class.domelement.php . С ним можно пропарсить все что угодно + он сам может подгружать документы.

Если к примеру Вам нужно вывести нуль, а он не выводится, из-за того, что это пустое значение, тогда лучше -- print empty($var) ? '0' : $var;
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 23.6.2011, 4:11; Ответить: alexdrob
Сообщение #7


(ZhukV @ 23.6.2011, 06:42) *
Вы сможете и так его спокойно округлить функциями rang, floor ....

не сможет, он и создал тему, потому что у него при таком коде
[PHP]$t = "1.25871";
$t = floor($t);[/PHP]
выходит 0

а всё потому что он немного не правильно код написал, у него перед числом есть текстовые символы, результат всегда будет 0.

Подсказка тут
(alexdrob @ 23.6.2011, 04:59) *
http://php.net/manual/ru/function.preg-match.php
Элемент $matches[0] будет содержать часть строки, соответствующую вхождению всего шаблона, $matches[1] - часть строки, соответствующую первой подмаске, и так далее.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
PRStudio
PRStudio
Topic Starter сообщение 23.6.2011, 12:17; Ответить: PRStudio
Сообщение #8


спасибо alexdrob, действительно я не правильно использовал preg_match, мне нужно было первое вхождение т.е. [1], теперь все работает :goodpost:

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Требуется помощь по сайту на "ВордПресс"
Закрылся доступ в панель администратора
12 Tia2 1533 25.3.2024, 6:54
автор: Skyworker
Открытая тема (нет новых ответов) ✅ sms.chekons.com - ⭐ Сервис для получения SMS на реальные номера USA "Non-VoIP, безлим SMS, API" ⭐
Сервис для получения SMS на реальные номера USA
10 Chekon 3582 24.3.2024, 14:15
автор: Chekon
Открытая тема (нет новых ответов) ⭐⭐⭐ Google Voice | Gmail - OLD аккаунты "SMS и звонки" ⭐⭐⭐
12 Chekon 3818 24.3.2024, 13:56
автор: Chekon
Опрос (нет новых голосов) Опрос: Результаты в упражнении "Жим лёжа" у вэбмастеров
35 Room 4465 13.3.2024, 13:10
автор: Room
Открытая тема (нет новых ответов) "Лежащий" домен - 10 лет. Продать?
8 Wolfhound 2386 5.3.2024, 3:22
автор: Liudmila


 



RSS Текстовая версия Сейчас: 29.3.2024, 12:59
Дизайн