Дублирование контента с PHP_URL_QUERY с RSS-лентами - PullRequest
3 голосов
/ 06 февраля 2012

Справочная информация:

Я создал динамический веб-сайт, на котором большая часть контента генерируется RSS-лентами с themoneyconvert.com

На веб-сайте отображаются курсы валют в реальном времени, такие как:

enter image description here

Надеюсь, вы поняли содержание, которое я отображаю в шаблоне из 3 столбцов.

URL фида на themoneyconverter.com настроены в скрипте, который я назвал 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 в конец существующего канала. Этот аргумент соответствует позиции XML-тега <item> в URL фида.

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

$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 сверху, добавив следующие строки кода и заменив числовое значение на переменную $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

    }

}

Вывод на вышеприведенных дисплеях:

enter image description here

Я ожидаю того же вывода в столбцах, что и раньше, но этот отличается. Есть идеи, где я ошибся?

Заранее спасибо

1 Ответ

1 голос
/ 06 февраля 2012

Посмотрите на ваш код в вашей первой get_currency_rate функции.

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

Давайте рассмотрим, что она выполняет.Или это,

    $rate = get_rate($xml, 15); //EUR 15
    $rate = get_rate($xml, 16); //GBP 16

или это,

    $rate = get_rate($xml, 15); //EUR 15
    $rate = get_rate($xml, 56);  //USD 56

Сейчас.Подумайте, что на самом деле будет выполнять ваша новая функция get_currency_rateto get_rate.

Примерно так:

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

Я верю, что вы можете обнаружить ошибку.Они оба приведут к распечатке одной и той же строки.

    0.76429 EUR
    0.76429 EUR

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

...