Дублирование контента с помощью PHP_URL_QUERY с RSS-потоками

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

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

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

введите описание изображения здесь

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

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

    }

}

Результат из приведенного выше отображает:

введите описание изображения здесь

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

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


person keenProgrammer    schedule 05.02.2012    source источник


Ответы (1)


Посмотрите на свой код в своей первой 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_rate функция.

    $vars = parse_url($feed, PHP_URL_QUERY);
    parse_str($vars);
    # This will mean $x = 15, 16 or whatever. This will be depending of your $feed.
    # If your $feed **is** http://themoneyconverter.com/rss-feed/USD/rss.xml?x=16
    # It will mean $x = 16 and the following code will be executed.

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

Or,

    $vars = parse_url($feed, PHP_URL_QUERY);
    parse_str($vars);
    # If your $feed **is** http://themoneyconverter.com/rss-feed/USD/rss.xml?x=15
    # It will mean $x = 15 and the following code will be executed.

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

Итак, в основном вы выполняете всегда два идентичных вызова 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

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

    function get_currency_rate($feed) {
        $xml = new SimpleXmlElement($feed);
        $vars = parse_url($feed, PHP_URL_QUERY);
        parse_str($vars);
        switch ($x) {
            case 15:
                get_rate($xml, 16); //GBP 16
                get_rate($xml, 56); //USD 56
                break;
            case 16:
                get_rate($xml, 15); //EUR 15
                get_rate($xml, 56); //USD 56
                break;
            case 56: default:
                get_rate($xml, 15); // EUR 15
                get_rate($xml, 16); // GBP 16
                break;
        }
    }
person Aron Cederholm    schedule 06.02.2012
comment
Отличный ответ. Оператор switch имеет большой смысл. Спасибо! - person keenProgrammer; 06.02.2012