Получаете лучший код? Иметь время внутри foreach - это хороший способ для этого? - PullRequest
1 голос
/ 22 ноября 2010

Я намереваюсь перечислить последние 2 заголовка в новостной ленте, где данный тег является чем-то.

Предполагая, что getCategories () и getValues ​​() являются рабочими методами.(они есть).

Может ли кто-нибудь помочь создать лучший код, чем этот?

(я даже не уверен, будет ли работать этот foreach внутри логики ...);

$feedUrl = 'http://www.abc.org/?feed=rss2';

$feed = Zend_Feed_Reader::import($feedUrl);

$lastNews = array();

   foreach ($feed as $key=>$entry)
   {
       if (in_array('tag A', $entry->getCategories()->getValues()))
       {
          while ($key < 2)
          {
             $lastNews['title'] = $entry->getTitle();
             $lastNews['link'] = $entry->getLink();
          }
       }
   }

ОБНОВЛЕНИЕ: Если я удалю часть while, я получу ВСЕ записи канала с соответствующим заголовком и ссылкой.Хорошо.

Однако я хочу добиться всего лишь ДВУХ записей с соответствующими заголовками и ссылками.

Добавить - две записи должны быть самыми последними.Но я прыгаю по порядку работы foreach, я дам самые последние из них в качестве первых ключей.(однако не уверен).

ОБНОВЛЕНИЕ II:

На основе @Dereleased Я знаю, что это:

(Я только что добавил []часть)

$okEntries = 0;
foreach ($feed as $key => $entry) {
  if ($okEntries >= 2) {
    break;
  }

  if (in_array('Tag A', $entry->getCategories()->getValues()))
  {
     $lastNews[]['title'] = $entry->getTitle();
     $lastNews[]['link'] = $entry->getLink();
     ++$okEntries;
   }
}

Я получаю это:

array(4) {
  [0]=>
  array(1) {
    ["title"]=>
    string(65) "test title A"
  }
  [1]=>
  array(1) {
    ["link"]=>
    string(33) "http://www.linkA.com"
  }
  [2]=>
  array(1) {
    ["title"]=>
    string(80) "Test title B"
  }
  [3]=>
  array(1) {
    ["link"]=>
    string(33) "http://www.linkB.com"
  }
}

Теперь массив [0] и [1] - это группа заголовков ссылок, а массив [2] и[3] являются второй группой массивов, как их можно разделить на две группы?

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

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

Ну, есть безумный однострочный подход:

$feedUrl = 'http://www.abc.org/?feed=rss2';

$feed = Zend_Feed_Reader::import($feedUrl);

return array_map(create_function('$cEntry',
                                 'return array("title" => $cEntry->getTitle(),
                                               "link" => $cEntry->getLink());'),
                 array_slice(array_filter($feed,
                                          create_function('$cEntry',
                                                          'return in_array("tag A",
                                                                           $cEntry->getCategories()->getValues());')),
                             -2, 2));

Но это может не сработать, если доступно менее двух подходящих записей, в зависимости от того, как array_slice () обрабатывает, так как записей меньше, чем запрошено, язабудьте.

Вероятно, лучший способ - использовать XPath в ленте, который является языком запросов XML.

Это пример, полностью не проверенный, он может не анализироваться, и XPath может быть немногоне подходит для вашего канала.

$feedUrl = 'http://www.abc.org/?feed=rss2';

$feed = Zend_Feed_Reader::import($feedUrl);

$feedXPath = $feed->getXpath();

$targetData = array();
foreach ($feedXPath->evaluate("//item[string(category)='tag A' and position()>=last()-1]" as $cEntry) {
    $targetData[] = array('title' => $feedXPath->evaluate('string(title)', $cEntry),
                          'link' => $feedXPath->evaluate('string(link)', $cEntry));
}

return $targetData;
2 голосов
/ 22 ноября 2010

Я никогда не использовал этот модуль, поэтому я не уверен на 100%, но логически я думаю, что это то, что вы хотите:

$feedUrl = 'http://www.abc.org/?feed=rss2';
$feed = Zend_Feed_Reader::import($feedUrl);

$lastNews = array();
$okEntries = 0;
foreach ($feed,true as $key => $entry) {
    if ($okEntries >= 2) {
        break;
    }
    if (in_array('tag A', $entry->getCategories()->getValues())) {
        $lastNews[$okEntries]['title'] = $entry->getTitle();
        $lastNews[$okEntries]['link'] = $entry->getLink();
        ++$okEntries;
    }
}

Редактировать: не понимал, что вы хотели последние два, но это должно сделать это.

...