web-dev-qa-db-ja.com

foreach内のコンテンツを1回だけエコーする

ステータスがオフラインまたは遅延に設定されている場合に基本的にLIを表示するために、次のPHPを作成しました。

<?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 } ?>

CSSを使用して、「ONLINE」のクラスが表示された場合、LIは非表示になります。

ただし、ステータスがOFFLINEまたはDELAYの場合に表示されるステートメントを追加したいので、次のように記述しました。これは機能しますが、foreachステートメントにより、OFFLINEまたはDELAYのあるすべてのLIに対して表示されます。一度だけ表示したい:

<?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

右、私は1つの方法を考え出しました。

まず、変数を配列として定義する必要があります。

$get_status = array();

次に、foreachループで、次のように、新しく定義された配列のすべての結果のステータスを組み合わせる必要があります。

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

foreachループの後、次のように配列を抽出する必要があります。

extract($get_status);

次に、配列内のすべてのステータスがすべて同じかどうかを確認し、次のようにメッセージを表示できます。

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

完全なコードとテスト済み:

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';
    }
}

お役に立てれば

PS:二重引用符を一重引用符で置き換えるなど、いくつかのマイナーな調整を行い、$symbolifステートメントの外側、$statusが一致しません(そうでない場合、PHPエラーがスローされます)

2
Lodder