[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не работают функции в движке
Юрий Шу
Здравствуйте.
У меня возник вопрос.

Написал скрипт-обработчик для погоды. «Заинклюдил» его на нужную страницу и вывел с него данные. Все работало.

Теперь пытаюсь все это интегрировать в движок. Делаю все аналогично, но, скрипт не работает корректно. Вывел промежуточные данные и выяснилось, что корректное исполнение скрипта прекращается на первой функции.

В чем может быть проблема, никак не пойму. Помогите пожалуйста разобраться.

P.S. Код пока не стал приводить, нужен?



Спустя 29 минут, 18 секунд (10.02.2009 - 15:30) REANIMATOR написал(а):
Цитата
Код пока не стал приводить, нужен?
желательно smile.gif

Спустя 13 минут, 16 секунд (10.02.2009 - 15:43) Юрий Шу написал(а):
PHP
<?
$h fopen("http://rp5.ru/xml.php?id=4931","r");
$content fread($h,4096);
clearstatcache();

fclose($h);

$g fopen("/pub/home/avt1c32/htdocs/weather/cron.xml","w");
$check fopen("/pub/home/avt1c32/htdocs/weather/check.txt","w");
$time date('H:i:s l d F',time());
if (
fwrite($g,$content)){
    
$cont "Запись прошла успешно в ".$time;
}
else {
    
$cont "Произошла ошибка в записи данных";
}
fwrite($check,$cont);
fclose($check);
fclose($g);

//считываем содержимое файла в массив arr построчно
$arr file("/pub/home/avt1c32/htdocs/weather/cron.xml");
//print_r($arr);

//функция, обрезающая теги у элементов массива
/*function delTags ($num){
global $arr;
$temp = strip_tags($arr[$num]);
return $temp;
}*/
function delTags($tag,$num) {
global 
$arr;
$search = array ("<$tag>","</$tag>");
$replace = array ("","");
$temp trim(str_replace($search,$replace,$arr[$num]));
return 
$temp;
}   

//формирование массива с нужными параметрами
$weather = array();
array_push($weatherdelTags("point_timestamp",9));
array_push($weatherdelTags("pressure",20));
array_push($weatherdelTags("temperature",21));
array_push($weatherdelTags("humidity",22));
array_push($weatherdelTags("wind_direction",23));
array_push($weatherdelTags("wind_velocity",24));
array_push($weatherdelTags("falls",25));
array_push($weatherdelTags("G",16));
array_push($weatherdelTags("cloud_cover",18));

//print_r($weather);

//обрабатываем данные массива weather для вывода на экран
//для месяца и дня
$moncon = array(1=>'Январь',2=>'Февраль',3=>'Март',4=>'Апрель',5=>'Май',6=>'Июнь',7=>'Июль',8=>'Август',9=>'Сентябрь',10=>'Октябрь',11=>'Ноябрь',12=>'Декабрь');
$date getdate ($weather[0]);
$month $moncon[$date["mon"]].", ".$date["mday"];

//для дня недели
$weekcon = array(1=>'понедельник',2=>'вторник',3=>'среда',4=>'четверг',5=>'пятница',6=>'суббота',7=>'воскресенье');
$week =$weekcon[$date["wday"]];

//функкция определения времени суток
function dayTime($key){
global 
$weather;
$daytime $weather[$key] == 15 "день" "ночь";
return 
$daytime;
}

//для направления ветра
$wind = array ('Ю'=>'южный','С'=>'северный','В'=>'восточный','З'=>'западный','С-В'=>'С-В','С-З'=>'С-З','Ю-В'=>'Ю-В','Ю-З'=>'Ю-З');

//если температура больше нуля, добавить знак плюс к числу
function positiveTemp($numc){
global 
$weather;
$tempr $weather[$numc] > "+".$weather[$numc] : $tempr $weather[$numc];
return 
$tempr;
}

//формирование массива weather для дальнейших прогнозов
//для периода спустя 12 часов
array_push($weatherdelTags("G",31));
array_push($weatherdelTags("cloud_cover",33));
array_push($weatherdelTags("temperature",36));
array_push($weatherdelTags("falls",40));

//для периода спустя 24 часа
array_push($weatherdelTags("G",46));
array_push($weatherdelTags("cloud_cover",48));
array_push($weatherdelTags("temperature",51));
array_push($weatherdelTags("falls",55));

//для периода спустя 36 часов
array_push($weatherdelTags("G",61));
array_push($weatherdelTags("cloud_cover",63));
array_push($weatherdelTags("temperature",66));
array_push($weatherdelTags("falls",70));


//функция определения даты прогноза
function getForecastDate($num){
global 
$weather;
$forecastdate date("j.m",$weather[0]+43200*$num);
return 
$forecastdate;
}

//функция определения картинки с осадками
function choosePic($key1,$key2,$key3,$root){
global 
$weather;
//если день и нет осадков
if (($weather[$key1] == 15) && ($weather[$key2] == 0)){
    if ((
$weather[$key3] > 0)  && ($weather[$key3] < 24)){
        
$sign $root."sunny";
    }
    if ((
$weather[$key3] > 25)  && ($weather[$key3] < 75)){
        
$sign $root."semisun";
    }
    if (
$weather[$key3] > 75){
        
$sign $root."cloud";
    }
}

//если день и дождь или дождь со снегом
if (($weather[$key1] == 15) && (($weather[$key2] == 1) || ($weather[$key2] == 2))){
    if ((
$weather[$key3] > 25)  && ($weather[$key3] < 75)){
        
$sign $root."sunrain";
    }
    if (
$weather[$key3] > 75){
        
$sign $root."raining";
    }
}

//если день и снег
if (($weather[$key1] == 15) && ($weather[$key2] == 3)){
    if ((
$weather[$key3] > 25)  && ($weather[$key3] < 75)){
        
$sign $root."moonsnow";
    }
    if (
$weather[$key3] > 75){
        
$sign $root."snowly";
    }
}

//если ночь и нет осадков
if (($weather[$key1] == 3) && ($weather[$key2] == 0)){
    if ((
$weather[$key3] > 0)  && ($weather[$key3] < 24)){
        
$sign $root."moon";
    }
    if ((
$weather[$key3] > 25)  && ($weather[$key3] < 75)){
        
$sign $root."semimoon";
    }
    if (
$weather[$key3] > 75){
        
$sign $root."cloud";
    }
}

//если ночь и дождь или дождь со снегом
if (($weather[$key1] == 3) && (($weather[$key2] == 1) || ($weather[$key2] == 2))){
    if ((
$weather[$key3] > 25)  && ($weather[$key3] < 75)){
        
$sign $root."moonrain";
    }
    if (
$weather[$key3] > 75){
        
$sign $root."raining";
    }
}

//если ночь и снег
if (($weather[$key1] == 3) && ($weather[$key2] == 3)){
    if ((
$weather[$key3] > 25)  && ($weather[$key3] < 75)){
        
$sign $root."moonsnow";
    }
    if (
$weather[$key3] > 75){
        
$sign $root."snowly";
    }
}
return 
$sign;
}

?>

          <div id="forecast" onMouseOver="document.getElementById('hide').style.display='block'" onMouseOut="document.getElementById('hide').style.display='none'">
           <div id="hide">
           <div id="hide1" style= "background:url(/images/<?=choosePic('9','12','10',"fc/thumb/")?>.gif) no-repeat;">
              <p class="temp"><?=positiveTemp('11')?></p>
              <p class="date"><?=getForecastDate(1)?></p>
              <p class="daytime"><?=dayTime('9')?></p>
           </div>
                   <div id="hide2" style= "background:url(/images/<?=choosePic('13','16','14',"fc/thumb/")?>.gif) no-repeat;">
                      <p class="temp"><?=positiveTemp('15')?></p>
              <p class="date"><?=getForecastDate(2)?></p>
              <p class="daytime"><?=dayTime('13')?></p>
           </div>
                   <div id="hide3" style= "background:url(/images/<?=choosePic('17','20','18',"fc/thumb/")?>.gif) no-repeat;">
                      <p class="temp"><?=positiveTemp('19')?></p>
              <p class="date"><?=getForecastDate(3)?></p>
              <p class="daytime"><?=dayTime('17')?></p>
           </div>
           </div>
            <div id="sign"><img src="/images/<?=choosePic('7','6','8',"fc/")?>.png" alt=""></div>
            <div class="Round R12">
        <a class="BannerLink"><img src="images/0.gif" alt="" /></a>
            <div class="RE png tl">
              <ins></ins>
            </div>
            <div class="RE png tr">
              <ins></ins>
            </div>
            <div class="RE png bl">
              <ins></ins>
            </div>
            <div class="RE png br">
              <ins></ins>
            </div>
            <div class="RData">
         <div class="prediction">
          <div id="first-column">
              <p>Ветер <?=$wind[$weather['4']]?><?=$weather['5']?> м/с</p>
              <p>Влажность <?=$weather['3']?> %</p>
              <p>Давление <?=$weather['1']?> мм</p>
              </div>
              <div id="second-column">
              <p class="city">Россия, Липецк</p>
              <p class="month"><?=$month?></p>
              <p class="day"><?=$week.", ".dayTime('7')?></p>
              <p class="temperature"><?=positiveTemp('2')?> ºС</p>
              </div>
             </div>
      </div>
            </div>
     &nbs


Весь верхний кусок я вставляю инклюдом и периодические запускаю cron'ом, но это не суть важно, так как не работает ни в одном, ни в другом случае smile.gif

Пробую делать print_r($weather) выводит пустой массив.
print_r($arr) же работает корректно.

P.S. Без движка этот код работает.

Спустя 1 час, 3 минуты, 29 секунд (10.02.2009 - 16:46) sergeiss написал(а):
Судя по твоему описанию, у тебя не происходит присвоение значенией вот тут где-то (потому что до этого места данные есть, а после - нету):
PHP
//формирование массива с нужными параметрами
$weather = array();
array_push($weather, delTags("point_timestamp",9));
array_push(....


Значит, надо копать функцию delTags. Или я что-то не понимаю?
Я предлагаю попробовать следующее, или последовательно, или всё сразу:
1. Не использовать global для массива $arr, а передавать его как параметр. Скорее даже не весь массив, а нужный его элемент, вместо позиции элемента в массиве, т.е. передавай просто ту строку, которую хочешь обработать.
2. Распечатывать промежуточные результаты прямо внутри функции DelTags, до выхода из функции, и сразу же после выхода из нее. Ты уже задавал вопрос насчет этой функции, но, похоже, "до ума" ее не довел.
3. Мне лично не нравится автоматическое назначение индексов массива $weather. Я бы использовал текстовые индексы. Например,
PHP
$weather['point_timestamp']=delTags('point_timestamp',9);

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

Спустя 31 минута, 33 секунды (10.02.2009 - 17:18) Юрий Шу написал(а):
sergeiss, попробую сделать как ты сказал, однако, все же смущает тот факт, что один и тот же код в разных «местах» работает по-разному.

разве это возможно? почему?

Спустя 16 часов, 30 минут, 41 секунда (11.02.2009 - 09:49) Юрий Шу написал(а):
Цитата
Не использовать global для массива $arr, а передавать его как параметр. Скорее даже не весь массив, а нужный его элемент, вместо позиции элемента в массиве, т.е. передавай просто ту строку, которую хочешь обработать.

Не очень понятно, как тут без global.
Можете привести код для функции?

Спустя 1 час, 51 минута, 27 секунд (11.02.2009 - 11:40) sergeiss написал(а):
ОК, смотри.
Вот у тебя написано
PHP
function delTags($tag,$num) {
global 
$arr;
// и используется $arr[$num] для анализа данных
...
}

Вызов функции:
PHP
delTags("point_timestamp",9));

Вопрос: а зачем нужен глобальный массив, если ты из него используешь только одну строку, и ничего в массиве не изменяешь?
А почему бы не сделать так:
PHP
function delTags($tag,$str) {
// global $arr; - это убираем отсюда
// и используем $str вместо $arr[$num]
...
}

Вызов функции:
PHP
delTags("point_timestamp",$arr[9]));


Global может быть полезен, когда ты данные модифицируешь, или какая-то сложная структура. Тут же короткая строка, которую лучше просто передать в функцию.
Может я и не прав, но язык Си меня ранее приучил к тому, что с глобальными переменными нужно как можно аккуратнее общаться - будет проще работать smile.gif Аккуратнее - это значит использовать их только тогда, когда это действительно необходимо.

Спустя 1 час, 57 минут, 11 секунд (11.02.2009 - 13:37) Юрий Шу написал(а):
sergeiss, я вас понял.
Благодарю за информацию smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.