Почему этот PHP неправильно анализирует XML? - PullRequest
0 голосов
/ 26 октября 2009

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

Окончательный вывод HTML выглядит следующим образом:

Что можно увидеть здесь: http://www.wdmadvertising.com.au/preview/cfs/index.shtml

todayMon______________19

todayTue______________26

Tue______________26

Это должно выглядеть так:

Today______________(temp)

(tomrrow)______________(temp)

(day after tomorrow)______________(temp)

PHP и HTML:

<div class="latest-weather">
    <h1 class="latest-weather">Latest weather</h1>

    include("class.xml.parser.php");
    include("class.weather.php");

$weather_adelaide = new weather("ASXX0001", 3600, "c", $cachedir);

    $weather_adelaide->parsecached(); 

    // TODAY 1

    for ($day=0; isset($weather_adelaide->forecast[$day]); $day++) {
    print "<h2>today".$weather_adelaide->forecast[$day]['DAY']."</h2>";     
    print "<p />".$weather_adelaide->forecast[$day]['HIGH']."<br>"; }

    // FORECAST 2

    for ($day=1; isset($weather_adelaide->forecast[$day]); $day++) {
    print "<h2>".$weather_adelaide->forecast[$day]['DAY']."</h2>";     
    print "<p />".$weather_adelaide->forecast[$day]['HIGH']."<br>"; }

    // FORECAST 3   

    for ($day=2; isset($weather_adelaide->forecast[$day]); $day++)  {
    print "<h2>".$weather_adelaide->forecast[$day]['DAY']."</h2>";          
    print "<p />".$weather_adelaide->forecast[$day]['HIGH']."<br>"; }

?>

</div><!--/latest-weather-->

Ответы [ 2 ]

2 голосов
/ 26 октября 2009

Либо вам не очень понятно, как работают циклы for, либо вы только что сделали действительно глупую ошибку.

В случае с первым, помните, что

for($x=0; isset(blah); $x++) {
    ...
}

эквивалентно

$x = 0;
while(isset(blah)) {
    ...
    $x++;
}

Похоже, вы только получаете прогнозы на сегодня и завтра; ваш первый цикл выдает:

todayMon______________19

todayTue______________26

Ваш второй цикл производит:

Tue______________26

А твой третий цикл ничего не производит.

Вы, вероятно, должны изменить свой код на что-то вроде этого:

// TODAY 1

if (isset($weather_adelaide->forecast[0])) {
    print "<h2>today</h2>";
    print "<p />".$weather_adelaide->forecast[0]['HIGH']."<br>";
}

// More days

for ($day=1; $day < 3 && isset($weather_adelaide->forecast[$day]); $day++) {
    print "<h2>".$weather_adelaide->forecast[$day]['DAY']."</h2>";
    print "<p />".$weather_adelaide->forecast[$day]['HIGH']."<br>";
}

Другой комментарий: я вижу, что вы используете <p />, но вы также используете <br>, это озадачивает. <br> недопустимо XHTML.

0 голосов
/ 26 октября 2009

Я предполагаю, что $weather_adelaide->forecast[0] и $weather_adelaide->forecast[1] установлены, поэтому вы получаете ваш первый for для печати 2 раза и второй для печати. Я думаю, вам нужно if, а не for: (не проверено)

// TODAY 1
$day = 0;
if(isset($weather_adelaide->forecast[$day])) {
    print "<h2>today".$weather_adelaide->forecast[$day]['DAY']."</h2>";     
    print "<p />".$weather_adelaide->forecast[$day]['HIGH']."<br>"; 
}

// FORECAST 2
++$day;
if (isset($weather_adelaide->forecast[$day])) {
    print "<h2>".$weather_adelaide->forecast[$day]['DAY']."</h2>";     
    print "<p />".$weather_adelaide->forecast[$day]['HIGH']."<br>"; 
}

// FORECAST 3       
++$day;
if (isset($weather_adelaide->forecast[$day]))  {
    print "<h2>".$weather_adelaide->forecast[$day]['DAY']."</h2>";              
    print "<p />".$weather_adelaide->forecast[$day]['HIGH']."<br>"; 
}

Но я бы пошел с foreach(range(0, 2) as $i) и обработал специальный сегодня случай с if

...