Говорящий код
$xchange = new SimpleXMLElement('http://www.bankisrael.gov.il/currency.xml', NULL, TRUE);
$filterCurrencies = array( 'USD', 'GBP' );
$filter = implode( array_map( function($filler) { return 'text()="'.$filler.'"'; }, $filterCurrencies), ' or ' );
$xpathQuery = $xpath = '//CURRENCYCODE[%filter%]/parent::*';
$xpathQuery = str_replace('%filter%', , $xpathQuery);
$currencies = $xchange->xpath($xpathQuery);
/** I do know you already have to code to echo it ... the code is tested, feel free to copy&pase **/
Шаг за шагом
Хорошо, во-первых, вы используете объект SimpleXML для чтения данных из банка Израиля. Я предлагаю использовать этот объект для выполнения большей части работы (что намного быстрее по сравнению с фильтрацией с помощью PHP, хотя SimpleXML не лучший вариант для повышения производительности).
Итак, прежде всего, чего мы хотим достичь? Получение данных на основе содержимого его элемента. Для веб-дизайнера это должно звучать как CSS, но не совсем правильно. Для веб-разработчика, имеющего в руках XML, который должен звучать как XPath, что является золотым выбором! К счастью, SimpleXML позволяет нам использовать XPath, поэтому мы построим запрос:
Основы XPath:
//CURRENCYCODE
выберет любой элемент currencycode
//CURRENCYCODE/parent::*
выберет родительский элемент currencycodes (<CURRENCY>
), в котором находятся наши данные
//CURRENCYCODE[text()="JPY"]
выберет только <CURRENCY>
элементов, текст которых равен JPY точно.
Здесь мы сольемся с нашим списком требований:
$filterCurrencies = array( 'USD', 'GBP' ); // we want us dollars and british pounds
$filter = implode( array_map( function($token) { return 'text()="'.$token.'"'; }, $filterCurrencies), ' or ' );
// this will make a string like 'text()="USD" or text()="GBP"' by mapping the filter against the requirements string (currenciecodes get tokens) glueing it with a logical or
Теперь осталось только интегрировать это с нашим шаблоном XPATH.
$xpath = '//CURRENCY[%filter%]/parent::*';
$xpath = str_replace('%filter%', $filter, $xpath);
$currencies = $xchange->xpath($xpath);
Удачного зацикливания!
person
Samuel Herzog
schedule
01.06.2011