показывать только первый элемент в цикле if-statment - PullRequest
0 голосов
/ 15 февраля 2020

Этот код:

require_once 'feed.php';

$title = 'Ev 134';

ob_start();
foreach(Feed('example.url') as $f ) {
    if (strpos($f->title, $title) !== false) {

        $green_color    = 'green';
        $orange_color   = 'orange';
        $red_color      = 'red';
        $closed_text    = 'closed';
        $maintenance_text   = 'maintenance';
        $exception_text = 'could be';

        if (strpos($f->title, $title) !== false){

            if(strpos($f->description, $closed_text) !== false){
                echo (strpos($f->description, $exception_text) === false) ?
                     '<span style="color:'.$red_color.';text-shadow: 2px 2px #a50000;">closed</span>' :
                    '<span style="color:'.$green_color.'">Open</span>' ;

            } else if(strpos($f->description, $maintenance_text) !== false){
                echo (strpos($f->description, $exception_text) === false) ?
                     '<span style="color:'.$orange_color.'">maintenance</span>' :
                     '<span style="color:'.$green_color.'">Open</span>' ;

            } else {
                echo '<span>Open</span>';
            }
        }
    }
}
$status = ob_get_contents();
ob_end_clean();

echo $status;

Выводит текущий прогноз погоды с дороги. Открыто / закрыто или обслуживание.

Моя проблема:

Потенциально могут быть выходы, которые приведут к openopen или maintenanceopen, что мне не нужно.

Я пытался:

if ($status = 'OpenOpen'){
  $status = 'Open';
}

но это сложно и запутанно со всеми возможными сценариями ios + это не работает так хорошо.

Что я хочу: если есть в нескольких отчетах только первый показывается и ставится * за текстом.

Любая помощь очень ценится!

1 Ответ

1 голос
/ 15 февраля 2020

Этот код вносит пару изменений.

Вместо использования буферизации вывода, это просто устанавливает значения в $status на всем протяжении. Это позволяет вам проверить, было ли установлено предыдущее значение, и добавить * в конец или, если оно достигает конца l oop, а $status все еще пусто, можно установить открытый текст.

Я также переместил текстовые назначения stati c за пределы l oop, поскольку вам не нужно каждый раз их устанавливать.

Наконец, у вас было if (strpos($f->title, $title) !== false) в два раза , так что это удаляет это ...

$green_color    = 'green';
$orange_color   = 'orange';
$red_color      = 'red';
$closed_text    = 'closed';
$maintenance_text   = 'maintenance';
$exception_text = 'could be';

$status = "";
$records = 0;
foreach(Feed('https://www.vegvesen.no/trafikk/xml/savedsearch.rss?id=604') as $f ) {
    $records++;
    if (strpos($f->title, $title) !== false) {
        if(strpos($f->description, $closed_text) !== false){
            // If no previous value, set main text,otherwise add *
            if ( empty($status) )   {
                $status = (strpos($f->description, $exception_text) === false) ?
                    '<span style="color:'.$red_color.';text-shadow: 2px 2px #a50000;">closed</span>'
                    : '<span style="color:'.$green_color.'">Open</span>' ;
            }
            else    {
                $status .= "*";
            }

        } 
        else if(strpos($f->description, $maintenance_text) !== false){
            if ( empty($status) )   {
                $status = (strpos($f->description, $exception_text) === false) ?
                    '<span style="color:'.$orange_color.'">maintenance</span>' :
                    '<span style="color:'.$green_color.'">Open</span>' ;

            }
            else    {
                $status .= "*";
            }
        }
    }
}

// If still empty, say open
if ( empty ( $status ) ){
    $status = '<span>Open</span>';
    if ( $records > 0 ) {
        $status.="*";
    }
}
echo $status;

Вы можете удалить тесты для (strpos($f->description, $exception_text) === false) при настройке оранжевой и красной частей и просто игнорировать этот элемент, если в тексте $exception_text .

...