Анализируйте RSS с помощью PHP

#php

#php

Вопрос:

Я пытаюсь включить анализатор php, который будет извлекать файл rss 2.0:

 <?php

  $doc = new DOMDocument();
  $doc->load('http://www.domain.com/blog/feed/');
  $arrFeeds = array();
  foreach ($doc->getElementsByTagName('item') as $node) {
    $itemRSS = array ( 
      'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
      'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
      'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
      'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue
      );
    array_push($arrFeeds, $itemRSS);
  }

//And trying to parse the return into a template:

$view_doc->assign("DOCID", $arrFeeds);

?>
  

Но полученный результат — это просто «Массив» 🙁

Я надеюсь, что вы можете дать мне несколько советов, ребята 🙂

С уважением!

Комментарии:

1. Рассматривали ли вы возможность использования открытого проекта SimplePie? Я использовал его в прошлом для обработки RSS, и он очень хорош!

Ответ №1:

Удалите $docidtrue = return $arrFeeds; и замените $docidtrue на $arrFeeds . Это должно работать так, как вы хотели.

Это выглядело бы так:

 <?php

$doc = new DOMDocument();
$doc->load('http://www.domain.com/blog/feed/');
$arrFeeds = array();
foreach ($doc->getElementsByTagName('item') as $node) {
    $itemRSS = array ( 
        'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
        'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
        'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
        'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue,
    );
    array_push($arrFeeds, $itemRSS);
}

//And trying to parse the return into a template:

$view_doc->assign("DOCID", $arrFeeds);

?>
  

return это не то, что вы хотели. Возможно, вы искали break (который завершает весь текущий цикл) или continue (который завершает текущую итерацию цикла и переходит к следующему).

Редактировать:

Поскольку вам нужна некоторая строка для передачи в assign() метод, мы можем создать что-то, что будет отображать список элементов вместо того, чтобы собирать их для дальнейшей обработки 🙂

 <?php

$doc = new DOMDocument();
$doc->load('http://www.domain.com/blog/feed/');
$feeds = '';
foreach ($doc->getElementsByTagName('item') as $node) {
    $feeds .= '<div>'
        .'<h2>'.$node->getElementsByTagName('title')->item(0)->nodeValue.'</h2>' // title
        .'<p>'.$node->getElementsByTagName('description')->item(0)->nodeValue.'</p>' // desc
        .'<p><a href="'.$node->getElementsByTagName('link')->item(0)->nodeValue.'">link</a></p>' // link
        .'<p>'.$node->getElementsByTagName('pubDate')->item(0)->nodeValue.'</p>' // date
        .'</div>';
}

//And trying to parse the return into a template:

$view_doc->assign("DOCID", $feeds);

?>
  

Это должно сработать 🙂

Но помните — то, что я только что сделал, просто неправильно. Вы должны проанализировать переменную, полученную из исходного решения в шаблоне. Я только что создал его в неправильном месте и передал сгенерированную строку в представление. Просмотр предназначен только для преобразования данных в отображаемый код (HTML).

Комментарии:

1. Некоторые подробности о return здесь: php.net/manual/en/function.return.php

2. @Tadeck пробовал это раньше, и результат просто выглядит как «массив» : ( Спасибо.

3. Это потому, что то, что вы делаете в $view_doc->assign(). Если бы вы могли указать его источник или хотя бы сказать, чего вы ожидаете от его второго параметра, это было бы полезно. Из того, что вы говорите, я могу просто предположить, что это $view_doc->assign("DOCID", $some_option) пытается отображаться $some_option в виде строки, и это оценивается как «массив».

4. Скажите: 1) что такое $ view_doc?, 2) что нужно передать в $ view_doc-> assign() в качестве второго параметра.

5. Я прошу прощения, что не сделал ссылки на движок за сценой, действительно ли XTemplate понимает то, что вы сказали, я посмотрю, какую информацию я могу проанализировать

Ответ №2:

 $docidtrue = return $arrFeeds;
  

Правильно, return просто возвращает значение вызывающей функции. Вы не можете назначить это чему-либо, потому что это сразу покидает функцию.

Я понимаю это, но я перепробовал все возможные способы, даже как предложил Тадек, и на выходе получается просто «Массив»

 $view_doc->assign("DOCID", $docidtrue);
  

Что такое $view_doc ? Поскольку он вызывается assign , я собираюсь предположить, что это какой-то движок для создания шаблонов, скорее всего smarty, и если да, то как выглядит шаблон, который печатает результаты?

Комментарии:

1. Я понимаю это, но я перепробовал все возможные способы, даже как предложил Тадек, и на выходе получается просто «Массив»

2. @Souza Смотрите запрос на разъяснения в строке.

3. @Tadeck Также, как отмечалось в комментарии выше, Souza получает вывод «Array», но эхо отсутствует. Скорее всего, это означает, что массив не зацикливается должным образом в шаблоне, поэтому я запрашиваю код шаблона

4. О, мы просто оба просили об одном и том же, но вы были первым на 2 минуты 🙂 Да, я знаю, что это было бы полезно — лучшее, что нужно сделать, это изменить код, отображающий это в представлении, но из-за отсутствия того, что нам нужно изменить, я предложил временное решение с генерацией строки и передачей ее вместо массива. Я знаю, что это нарушает хорошие практики, но Соуза учится 🙂 и ему нужно с чем-то поиграть — если он предоставит код шаблона, мы сможем помочь ему больше.

Ответ №3:

вы не можете написать: $docidtrue = return $arrFeeds; особенно в foreach, это означает, что он просто прервется с первого раза … более того, вы не можете изменить возврат

Ответ №4:

проблема здесь выглядит как код «$ docidtrue = return $ arrFeeds;», основанный на сообщении «неожиданный T_RETURN». Я бы сказал, что вам, вероятно, следует удалить «$ docid =»