2011-05-11 10 views
3

PHPを使用してXMLファイルからデータを出力しています。時代順にデフォルト設定されていますが、これを逆にしたいと思います。これはPHPでも可能ですか?もしそうなら、どうですか?あなたの助けのためのPHPを使用したXMLの逆順

$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>'; 
     } 
    } 

ありがとう:

は、ここに私のpageとのコードです!

答えて

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 - ありがとう。はい、私は外部XMLファイルで* simplexml_load_file *を使用していて、それを表示するために質問を更新しました。あなたのコードを動作させることができないようです - 代わりに* simplexm_lement *を使うために* simplexml_load_file *を変更する必要がありますか? – Ryan

+0

@Ryan - simplexml_load_fileに何もする必要はありません。 xmlファイルが正常に読み込まれると、SimpleXMLElementオブジェクトが返されます(失敗した場合はfalse)。 2番目のforeachでは、$ xmlは$ xmlArrayである必要があります。 –

+0

@Erik Nedwidek更新された答えを試してみると、次のようになります:致命的なエラー:キャッチされない例外 'Exception'メッセージで 'Stringを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 
} 

をしかし。

+0

ご返信ありがとうございます。警告: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では、li内の4つの線が正しくないとマークされています。あなたのコードをアップロードすると、私はこのエラーになります:パースエラー:構文エラー、予期しない '、' on line 19 – Ryan

関連する問題