it-swarm.com.de

Echo-Inhalt in foreach nur einmal

Ich habe das folgende PHP geschrieben, um grundsätzlich eine LI anzuzeigen, wenn der Status auf Offline oder Verzögerung gesetzt ist:

<?php
    if(count($rows) > 0) {  
        foreach($rows as $row)
            {
                $service = $row->service;
                $details = $row->status_details;
                $status = $row->status;
                // status image check       
                    if($status == "ONLINE")
                    {
                        $symbol = "online.png";
                    }
                    if($status == "OFFLINE")
                    {
                        $symbol = "offline.png";
                    }
                    if($status == "DELAY")
                    {
                        $symbol = "delay.png";
                    }
        ?>

        <li class="<?php echo $status; ?>">
            <img src="<?php echo $moduleLoc, $symbol;?>" alt="Service Status <?php echo $service; ?>" /> <span class="details"><?php echo $details; ?></span></li>
        </li>
        <?php   

                }

        ?>
        <?php } ?>

Wenn mit CSS die Klasse "ONLINE" angezeigt wird, wird LI ausgeblendet.

Ich möchte jedoch eine Anweisung hinzufügen, die angezeigt werden soll, wenn der Status OFFLINE oder DELAY lautet. Ich habe Folgendes geschrieben, was funktioniert, aber aufgrund der foreach-Anweisung wird dies für jedes LI angezeigt, das OFFLINE oder DELAY enthält. Ich möchte, dass es nur einmal angezeigt wird:

<?php
    if(($status == "OFFLINE") || ($status == "DELAY")){
        echo '<li class="systemsGo"><img src="' . $moduleLoc . 'online.png" alt="Online Update" /><span class="details">All Other Applications Are Working Well</span></li>';   
    }
?>
2
RustyJoomla

Richtig, ich habe eine Methode gefunden.

Sie müssen zuerst eine Variable als Array definieren:

$get_status = array();

Dann müssen Sie in der foreach -Schleife den Status aller Ergebnisse in diesem neu definierten Array wie folgt kombinieren:

foreach ($rows as $row)
{
    $get_status[] = $status;
}

Nach der foreach -Schleife müssen Sie das Array wie folgt extrahieren:

extract($get_status);

dann können Sie überprüfen, ob alle Status im Array gleich sind, und eine Meldung wie folgt anzeigen:

if (count(array_unique($get_status)) === 1 && end($get_status) === 'ONLINE')
{
    echo 'All systems are online';
}

Vollständiger Code und getestet:

if (count($rows) > 0) 
{
    $get_status = array();

    foreach ($rows as $row)
    {
        $service = $row->service;
        $details = $row->status_details;
        $status  = $row->status;
        $symbol  = '';

        // status image check       
        if ($status == 'ONLINE')
        {
            $symbol = 'online.png';
        }
        if ($status == 'OFFLINE')
        {
            $symbol = 'offline.png';
        }
        if ($status == 'DELAY')
        {
            $symbol = 'delay.png';
        }

        $get_status[] = $status;
    ?>
        <li class="<?php echo $status; ?>">
            <img src="<?php echo $moduleLoc, $symbol;?>" alt="Service Status <?php echo $service; ?>" />
            <span class="details"><?php echo $details; ?></span>
        </li>

    <?php   
    }

    extract($get_status);

    if (count(array_unique($get_status)) === 1 && end($get_status) === 'ONLINE')
    {
        echo 'All systems are online';
    }
    else if (count(array_unique($get_status)) === 1 && end($get_status) === 'OFFLINE')
    {
        echo 'All systems are offline';
    }
    else if (count(array_unique($get_status)) === 1 && end($get_status) === 'DELAY')
    {
        echo 'All systems are delayed';
    }
    else
    {
        echo 'Not the same';
    }
}

Hoffe das hilft

P.S: Ich habe ein paar kleine Verbesserungen vorgenommen, wie das Ersetzen von doppelten Anführungszeichen durch einfache Anführungszeichen und auch das Definieren von $symbol Außerhalb Ihrer if -Anweisungen müssen Sie nur die $status stimmt nicht überein (wirft andernfalls einen PHP error)

2
Lodder