kotboris
@kotboris
Руководитель студии, дизайнер и разработчик сайтов

Хочу разобраться в коде данного скрипта. Как выдернуть элемент из массива в данном примере?

$file = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d/m/Y"));
	
	$valutes = array();
	
	foreach ($file AS $el){
	    $valutes[strval($el->CharCode)] = strval($el->Value);
	}
	print_r($valutes);

Код довольно простой, но мне как новичку в нем тяжело разобраться. Данный скрипт выводит из файла XML ЦБ курсы валют за сегодняшний день. Помогите пожалуйста разобраться что происходит в данном примере и выдернуть из массива только USD и EUR.
То что я понял на данный момент:
Сначала загружается сам файл xml и представляется как объект и объявляется как переменная $file. Затем объявляется переменная $valutes, которая является массивом. Потом происходит перебор массива и тут у меня возникают сложности с пониманием логики происходящего. Почему $file as $el и почему тут первая строка заключена в квадратные скобки, а вторая нет: "$valutes[strval($el->CharCode)] = strval($el->Value);"?
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Почему $file as $el
Потому, что по очереди перебирают все значения из file, так уж этот foreach работает.

почему тут первая строка заключена в квадратные скобки, а вторая нет
Потому, что записывают данные в ассоциативный массив, где CharCode будет ключом, а Value значением.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mykolaim
PHP developer
Ответ написан
Комментировать
$file в вашем случае не массив, а объект SimpleXMLElement, он наполнен данными из xml файла, сам класс SimpleXMLElement имплементирует интерфейс Traversable, что позволяет ему использоваться в цикле foreach, $el - также объект типа SimpleXMLElement, доступ к его полям можно получить напрямую, как тут $el->CharCode, это работает через магический метод __get(). __toString() - метод, который приводит объект SimpleXMLElement к строке.
Чтобы подробнее понять, как он работает и что есть внутри, загляните в класс SimpleXMLElement и посмотрите, что там есть, тогда станет понятнее.

Что касается кода, то можно записать как-то так:

$file = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=" . date("d/m/Y"));

        $values = [];

        foreach ($file as $el) {
            if ($el->CharCode == 'USD' || $el->CharCode == 'EUR') {
                $values[$el->CharCode->__toString()] = $el->Value->__toString();
            }
        }
        print_r($values);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы