(PHP) Предопределенная строка для запуска через одну функцию

В настоящее время я разрабатываю страницу с 20 блоками, каждый из которых представляет канал RSS, используя simplepie в качестве парсера.

В настоящее время сценарий вызывает первое изображение из каждого канала, отбрасывает остальные и устанавливает это изображение в качестве background-image блока.

С 20 фидами я хочу, чтобы код был маленьким и эффективным, насколько это возможно. Хотя я понимаю отдельную настройку $feed01, $feed02 - необходимое грязное зло, которое требуется для работы simplepie.

Что я не могу понять, так это то, почему imageurl() возвращает нулевое значение.

Может ли кто-нибудь объяснить мне, почему это может быть?

Большое спасибо

<?php
require_once('isnotabear/php/autoloader.php');

$feed01 = new SimplePie();
$feed01 -> set_feed_url ('http://link/to/rss01');
$success = $feed01 -> init();
$feed01 -> handle_content_type();
$max = $feed01 -> get_item_quantity(); // Where do we end?

$feed02 = new SimplePie();
$feed02 -> set_feed_url ('http://link/to/rss02');
$success = $feed02 -> init();
$feed02 -> handle_content_type();
$max = $feed02 -> get_item_quantity(); // Where do we end?

$start = (isset($_GET['start']) && !empty($_GET['start'])) ? $_GET['start'] : 0; // Where do we start?
$length = (isset($_GET['length']) && !empty($_GET['length'])) ? $_GET['length'] : 1; // How many per page?


function imageurl()
{
    if ($success): foreach($feedin->get_items($start, $length) as $item): $feedin =     $item-> get_feed();
    {
        $replace = preg_match( '@src="([^"]+)"@' , $item->get_content(), $match );
        $match = preg_replace ('"src="', '', $match);
        $match = str_replace('"', "'", $match);
        echo $match[0];
    }
    endforeach;
    endif;
};

?>
<!DOCTYPE HTML>
... YADA YADA YADA ...

<a href="#" style="background-image:url(<?php $feedin = $feed01; imageurl(); ?>)"><div> <span>FEED NAME</span></div></a>

2 ответа

$success не определено внутри imageurl(), так что всегда будет null/false

Вы, вероятно, хотите:

function imageurl() {
   global $success;
   if ($success) { .... }
}

Но не используйте такие глобалы. Передайте $success в качестве параметра. Это будет намного чище.

Это часть пути между комментарием и ответом, но я хотел, чтобы место показывало код. Ваша функция использует очень неловкое сочетание синтаксиса PHP и некоторых вводящих в заблуждение знаков препинания:

  • if(): ... endif; а также foreach(): ... endforeach; синтаксис чрезвычайно старомоден и обычно используется только при использовании PHP в качестве языка шаблонов (то есть в середине HTML), а не в отдельной функции, подобной этой
  • {, }и отступы не относятся ни к if ни foreach; PHP будет игнорировать их, но они запутают любого, кто читает ваш код
  • ; в конце также игнорируется - функция заканчивается на своем }

Таким образом, ваш код должен выглядеть так (обратите внимание, я также добавил $success а также $feedin в качестве параметров, которые вы должны передать в функцию):

function imageurl($success, $feedin)
{
    if ($success)
    {
        foreach($feedin->get_items($start, $length) as $item)
        {
            $feedin = $item->get_feed();
            $replace = preg_match( '@src="([^"]+)"@' , $item->get_content(), $match );
            $match = preg_replace ('"src="', '', $match);
            $match = str_replace('"', "'", $match);
            echo $match[0];
        }
    }
}

О, и вы, вероятно, хотите return $match[0] скорее, чем echo Это. В противном случае, он все еще собирается вернуться null все, что вы проходите.

Другие вопросы по тегам