【问题标题】:Echo once with OR statement if value equals to如果值等于,则使用 OR 语句回显一次
【发布时间】:2021-07-19 17:51:06
【问题描述】:

我是个 PHP 新手。所以请耐心等待;-)。但是在这里搜索后,我能够将初始代码更改为以下。

  1. 我的问题是,如果在各个字段值中找到值“文件”,“我的消息”将出现多次。我需要的是,只要至少一个字段包含“文件”,该消息只会出现一次

  2. 我确信下面的代码可以大大缩短。

        <?php if($this->item->params->get('itemExtraFields') && isset($this->item->extra_fields) && count($this->item->extra_fields)): ?>
        
        <?php foreach ($this->item->extra_fields as $key => $extraField): ?>
        <?php if($extraField->name == "Original" OR $extraField->name == "Wallpaper"): ?>
        <?php if (strpos($extraField->value, 'file') !== false): ?><?php echo 'My message here'; ?>
        <?php endif; ?><?php endif; ?><?php endforeach; ?>
        
        <h3 class="extra3">Gears</h3>
        <?php foreach ($this->item->extra_fields as $key => $extraField): ?>
         <?php if($extraField->name == "Camera"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "Lens"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "Aperture"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "Exposure"): ?><span class="rft shifts"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "ISO"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "Focal Length"): ?><span class="rft shifts"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "HDR"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php endforeach; ?>
        
        <h3 class="extra4">Download</h3>
        <?php foreach ($this->item->extra_fields as $key => $extraField): ?>
         <?php if($extraField->name == "Original"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "File Size"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "Dimensions (px)"): ?><span class="rft"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "Wallpaper"): ?><span class="rft shift2"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php if($extraField->name == "Format"): ?><span class="rft shifts"><strong><?php echo $extraField->name; ?>:</strong> <?php echo $extraField->value; ?></span><?php endif; ?>
         <?php endforeach; ?>
          
        <?php endif; ?>

【问题讨论】:

    标签: php html css mysql


    【解决方案1】:

    由于您是在 foreach 中执行此操作,因此每次都会打印出来。因此,如果您只需要显示一次,则需要将已经显示的信息存储在某处:

    <?php $displayedFileInfo = false; ?>
    <?php foreach ($this->item->extra_fields as $key => $extraField): ?>
    <?php if($extraField->name == "Original" OR $extraField->name == "Wallpaper"): ?>
    <?php if (strpos($extraField->value, 'file') !== false && !$displayedFileInfo): ?><?php echo 'My message here'; $displayedFileInfo = true; ?>
    <?php endif; ?><?php endif; ?><?php endforeach; ?>
    

    另一种可能性是跳出循环,因为您除了打印一个信息之外没有做任何其他事情:

    <?php foreach ($this->item->extra_fields as $key => $extraField): ?>
    <?php if($extraField->name == "Original" OR $extraField->name == "Wallpaper"): ?>
    <?php if (strpos($extraField->value, 'file') !== false): ?><?php echo 'My message here'; break; ?>
    <?php endif; ?><?php endif; ?><?php endforeach; ?>
    

    其他一些注意事项:

    1. 代码难以阅读,请尝试切换到这种格式:
    <?php
    
    $displayedFileInfo = false;
    foreach($this->item->extra_fields as $key => $extraField) {
        if ($extraField->name == "Original" || $extraField->name == "Wallpaper") {
            if (strpos($extraField->value, 'file') !== false && !$displayedFileInfo) {
                echo 'My message here';
                $displayedFileInfo = true;
            }
        }
    }
    
    1. 不要使用andor,使用&amp;&amp;(和)和||(或)。这两者的行为略有不同,大多数时候您希望&amp;&amp;|| 的行为。

    2. 使用 switch 代替多个 if 语句:

    <?php
    
    switch($extraField->name) {
        case "Camera":
            echo "<span class='rft'><strong>{$extraField->name}:</strong> {$extraField->value}</span>";
            break;
            // etc.
    }
    

    【讨论】:

    • 跳出循环比跟踪值是否显示更有意义。这样我们就不会不必要地迭代数组的其余部分。
    • @El_Vanja 是的,在这种情况下是的,会更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多