2011-05-11 2 views
3

Я использую PHP для вывода данных из XML-файла. Это не соответствует хронологическому порядку, который я бы хотел отменить. Это возможно с PHP? Если да, то как?Обратный порядок XML с использованием PHP

Вот мой page и код:

$file = 'http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml'; 
    $xml = simplexml_load_file($file); 

     foreach ($xml as $event_date) { 
     if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
     { 
      echo '<li>'; 
       echo '<h3>', $event_date->event['vn'], ' vs ', $event_date->event['hn'], '</h3>'; 
       echo '<p><strong>', $event_date->event['vs'], ' - ', $event_date->event['hs'], '</strong></p>'; 
       echo '<p>', date('F j, Y', strtotime($event_date['date'])), '</p>'; 
      echo '</li>'; 
     } 
    } 

Спасибо за вашу помощь!

ответ

6

В качестве первых нот ответа, это не может быть хорошей идеей, с большими документами XML. Простейшим и наиболее переносимым кодом для PHP 5.1.2 и выше может быть использование SimpleXML. Возможно, он был встроен в более ранние версии PHP, но он является стандартным после 5.1.2.

<?php 

$file = 'http://www.gostanford.com/data/xml/events/m-baskbl/2010/index.xml'; 
$xml = simplexml_load_file($file); 

if ($xml === false) { 
    echo "Couldn't load file\n"; 
    exit (1); 
} 

$xmlArray = array(); 

foreach ($xml as $event_date) $xmlArray[] = $event_date; 

$xmlArray = array_reverse($xmlArray); 

foreach ($xmlArray as $event_date) { 
    if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
    { 
      echo '<li>'; 
       echo '<h3>', $event_date->event['vn'], ' vs ', $event_date->event['hn'], '</h3>'; 
       echo '<p><strong>', $event_date->event['vs'], ' - ', $event_date->event['hs'], '</strong></p>'; 
       echo '<p>', $event_date['date'], '</p>'; 
       echo '<p>', $event_date->event['local_time'], '</p>'; 
      echo '</li>'; 
    } 
} 


?> 
+0

@Erik Nedwidek - спасибо и да, я использую * simplexml_load_file * с внешним XML-файлом и обновил свой вопрос, чтобы показать это. Я не могу заставить ваш код работать - мне нужно изменить * simplexml_load_file *, чтобы использовать * simplexmlelement * вместо этого? – Ryan

+0

@Ryan - Вам не нужно ничего делать для simplexml_load_file. Если он успешно загружает xml-файл, он возвращает объект SimpleXMLElement (false при ошибке). Во втором foreach $ xml должен быть $ xmlArray. (исправлен ответ orignal) –

+0

@Erik Nedwidek Когда я попробую ваш обновленный ответ, я получаю следующее: Неустранимая ошибка: исключение исключение «Исключение» с сообщением «Строка не может быть проанализирована как XML». Любая идея, что я делаю неправильно? Благодарю. – Ryan

1

Очевидно, вы можете прочитать свой xml в массиве и распечатать в обратном порядке. Однако это может быть хорошей идеей для длинного списка.

EDIT:

foreach($xml as $event_date){ 
    if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
    { 
     $my[]=array (
      "vn" => $event_date->event['vn'], 
      "hn" => $event_date->event['hn'] 
      ... 
     ); 
    } 
} 

for($i=count($my)-1;$i>=0;$i--) { 
    echo '<li>'; 
     echo '<h3>', $my[$i]['vn'], ' vs ', $my[$i]['hn']; 
     ... 
    echo '</li>'; 
} 

Надеется, что это помогает, это может понадобиться исправления.

+0

Как я могу это сделать? Список не так длинный - может быть 200-300 строк макс. – Ryan

+0

Это, кажется, не работает для меня. Мне нужно, чтобы он появился в обратном хронологическом порядке. Вы знаете, как это сделать? – Ryan

+0

Извините за поздний ответ, вы можете отсортировать массив между ними, согласно вашему требованию. –

1

$xml Если это просто массив, вы можете использовать array_reverse($xml) повернуть его вспять:

foreach (array_reverse($xml) as $event_date) { 
    // etc 
} 

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

for ($i = sizeof($xml) - 1; $i >= 0; --$i) { 
    // use $xml[$i] to access each element 
} 
+0

Спасибо за ваш ответ. К сожалению, это порождает эту ошибку: Warning: array_reverse() [function.array-reverse]: аргумент должен быть массивом в строке 14 – Ryan

+1

Объект xml не является массивом. Он реализует Traversable, поэтому его можно использовать в foreach, но не обрабатывать как массив. –

1

Можете ли вы изменить свой выход вместо xml? IE:

$arr = array(); 
    foreach($xml as $event_date){ 
     if(!empty($event_date->event['vn']) && !empty($event_date->event['hn']) && !empty($event_date->event['vs']) && !empty($event_date->event['hs'])) 
     { 
     $strLine = ""; 
     $strLine .= '<li>'; 
     $strLine .= '<h3>'. $event_date->event['vn']. ' vs '. $event_date->event['hn']. '</h3>'; 
     $strLine .= '<p><strong>'. $event_date->event['vs']. ' - '. $event_date->event['hs']. '</strong></p>'; 
     $strLine .= '<p>'. $event_date['date']. '</p>'; 
     $strLine .= '<p>'. $event_date->event['local_time']. '</p>'; 
     $strLine .= '</li>'; 
     $arr[] = $strLine; 
     } 
    } 
    $arr = array_reverse($arr); 
    foreach ($arr as $line) 
    { 
     echo $line; 
    } 
+0

спасибо, но в вашем примере есть несколько синтаксических ошибок, которые я не уверен, как исправить. Можете ли вы изменить свой код? – Ryan

+0

@Ryan Извините. Все еще в javascript режиме с "var." Помимо этого все проверяет мою IDE. Есть ли конкретная ошибка, которую вы получаете? –

+0

В Dreamweaver четыре strLine внутри li отмечены неверно. Когда я загружаю свой код, я получаю эту ошибку: Ошибка синтаксиса: ошибка синтаксиса, неожиданная ',' в строке 19 – Ryan

Смежные вопросы