3

バックグラウンド:

themoneyconvert.comからの RSS フィードによって多くのコンテンツが生成される動的な Web サイトを作成しました。

ウェブサイトには、次のようなライブ通貨レートが表示されます。

ここに画像の説明を入力

3 列のテンプレートに表示されている内容を理解していただければ幸いです。

themoneyconverter.comへのフィード URLは、私が呼び出したスクリプトで設定されます。cityConfig.php

<?php

// Feed URL's //
$theMoneyConverter = 'http://themoneyconverter.com/rss-feed/';

// Define arrays // 
$cities = array('London', 'New York', 'Paris');
$currencySource = array($theMoneyConverter . 'GBP/rss.xml?x=15', $theMoneyConverter . 'USD/rss.xml?x=16', $theMoneyConverter . 'EUR/rss.xml?x=56');
?>

フィード URL は$currencySource配列に格納されます。各 URL の末尾に引数を追加しました。たとえば、配列の最初の項目が?x=15既存のフィードの末尾に追加されています。この引数は<item>、フィード URL からの XML タグの位置に対応します。

タグにアクセスすると、関数内にある次のコード行によってアクセスされます。

$currency['rate'] = $xml->channel->item[$x]->description;

$x引数を渡す先の変数に注目してください。

次の関数は、私のgetCurrencyRate.phpスクリプトにあります。

<?php 

// Get XML data from source
// Check feed exists 

function get_currency_xml($currencySource) {

    if (isset($currencySource)) {
        $feed = $currencySource;
    } else {
        echo 'Feed not found.  Check URL';
    }

    if (!$feed) {
        echo('Feed not found');
    }

return $feed;
}

function get_currency_rate($feed) {

    $xml = new SimpleXmlElement($feed);

    $rate = get_rate($xml, 15); //EUR 15
    if ($feed == 'http://themoneyconverter.com/rss-feed/USD/rss.xml?x=16') {
        $rate = get_rate($xml, 16); //GBP 16
    } else {
        $rate = get_rate($xml, 56);  //USD 56
    }
}

上記の値をハードコーディングしたことに注意してください15, 16 and 56 。この出力は、投稿の上部にある最初の画像で確認できます。私がやろうとしているのは、cityConfig.phpスクリプトに示すように、フィードに設定された引数からこれらの値を解析して取得することです。

上記のget_rate関数は以下を呼び出します。

// Get and return currency rate
// Perform regular expression to extract numeric data
// Split title string to extract currency title 
function get_rate(SimpleXMLElement $xml, $x) {

    $x = (int)$x; 

    $currency['rate'] = $xml->channel->item[$x]->description;

    preg_match('/([0-9]+\.[0-9]+)/', $currency['rate'], $matches);
    $rate = $matches[0];

    $title['rate'] = $xml->channel->item[$x]->title;
    $title = explode('/', $title['rate']);
    $title = $title[0];

    echo $rate . ' ' . $title . '<br />';
}

私の目標を達成するためにget_currency_rate、次のコード行を追加し、数値を variable に置き換えることにより、上記の関数を変更しました$x

 $vars = parse_url($feed, PHP_URL_QUERY);
 parse_str($vars);

および変更された関数:

function get_currency_rate($feed) {

    $xml = new SimpleXmlElement($feed);

    $vars = parse_url($feed, PHP_URL_QUERY);
    parse_str($vars);

    $rate = get_rate($xml, $x); //EUR 15
    if ($feed == 'http://themoneyconverter.com/rss-feed/USD/rss.xml?x=16') {
        $rate = get_rate($xml, $x); //GBP 16
    } else {
        $rate = get_rate($xml, $x);  //USD 56

    }

}

上記の出力は次のように表示されます。

ここに画像の説明を入力

以前と同じ列の出力を期待していますが、これは異なります。私が間違っていたアイデアはありますか?

前もって感謝します

4

1 に答える 1

1

get_currency_rate最初の関数でコードを見てください。

    $ rate = get_rate($ xml、15); //15ユーロ
    if($ feed =='http://themoneyconverter.com/rss-feed/USD/rss.xml?x=16'){
        $ rate = get_rate($ xml、16); // GBP 16
    } そうしないと {
        $ rate = get_rate($ xml、56); // USD 56
    }

それが何を実行するかを調べてみましょう。これか、

    $ rate = get_rate($ xml、15); //15ユーロ
    $ rate = get_rate($ xml、16); // GBP 16

またはこれ、

    $ rate = get_rate($ xml、15); //15ユーロ
    $ rate = get_rate($ xml、56); // USD 56

今。get_currency_rate新しい関数が実際に何を実行するかを検討してください。

    $ vars = parse_url($ feed、PHP_URL_QUERY);
    parse_str($ vars);
    #これは、$ x = 15、16などを意味します。これは$feedによって異なります。
    #$feedが**is **http://themoneyconverter.com/rss-feed/USD/rss.xml?x=16の場合
    #$ x = 16を意味し、次のコードが実行されます。

    $ rate = get_rate($ xml、16); // EUR 15#$ x = 16
    if($ feed =='http://themoneyconverter.com/rss-feed/USD/rss.xml?x=16'){
        $ rate = get_rate($ xml、16); // GBP 16#$ x = 16
    }

または、

    $ vars = parse_url($ feed、PHP_URL_QUERY);
    parse_str($ vars);
    #$feedが**is **http://themoneyconverter.com/rss-feed/USD/rss.xml?x=15の場合
    #$ x = 15を意味し、次のコードが実行されます。

    $ rate = get_rate($ xml、15); // EUR 15#$ x = 15
    if($ feed =='http://themoneyconverter.com/rss-feed/USD/rss.xml?x=16'){
    } そうしないと {
        $ rate = get_rate($ xml、15); // USD 56#$ x = 15
    }

したがって、基本的に実行しているのは、常にget_rateへの2つの同一の呼び出しです。

そのようです、

    $ rate = get_rate($ xml、15); // EUR 15#$ x = 15
    $ rate = get_rate($ xml、15); // USD 56#$ x = 15

私は今では信頼しています、あなたはエラーを見つけることができます。どちらも同じ行が印刷されます。

    0.76429ユーロ
    0.76429ユーロ

解決策として、次のようなスイッチケース構造をお勧めします。

    関数get_currency_rate($ feed){
        $ xml = new SimpleXmlElement($ feed);
        $ vars = parse_url($ feed、PHP_URL_QUERY);
        parse_str($ vars);
        スイッチ($ x){
            ケース15:
                get_rate($ xml、16); // GBP 16
                get_rate($ xml、56); // USD 56
                壊す;
            ケース16:
                get_rate($ xml、15); //15ユーロ
                get_rate($ xml、56); // USD 56
                壊す;
            ケース56:デフォルト:
                get_rate($ xml、15); //15ユーロ
                get_rate($ xml、16); //16ポンド
                壊す;
        }
    }
于 2012-02-06T06:52:19.563 に答える