突出显示foreach循环中的最大值和最小值

时间:2020-08-24 12:09:33

标签: php

如何突出显示PHP foreach中的最高和最低值? 这是一个简单的示例,$ results是数组中的SQL结果。 我想用简单的CSS(例如背景色)突出显示最高值和最低值。

<h3>Camera </h3>

<table class="table">
<tbody>


<tr>
<td>Rear Camera Megapixel</td>
<?php foreach ($results as $result){ ?>
    <td> <strong><?php echo $result['rear_camera']; ?></strong> </td>
<?php } ?>
</tr>


<tr>
<td>Front Camera Megapixel</td>
<?php foreach ($results as $result){ ?>
    <td> <strong><?php echo $result['front_camera']; ?></strong> </td>
<?php } ?>
</tr>

</tbody>
</table>

原始结果

enter image description here

预期结果

enter image description here

如何检测foreach中的高值和低值。还是应该在将数据提供给foreach之前这样做?

2 个答案:

答案 0 :(得分:0)

这是应该起作用的代码:

 <?php 
$results = array(1, 2, 3, 44, 54, 56, 122, 34, 9);
$max_value = max($results);
$min_value = min($results);
foreach($results as $result){
    if ($result == $max_value) {
        echo '<td style="background-color: green;">'.$result.'</td>';
    }
    elseif ($result == $min_value){
        echo '<td style="background-color: red;">'.$result.'</td>';
    }
    else{
        echo '<td>'.$result.'</td>'; 
    }

    
}?>

您可以轻松地使用.连接字符串,而不必一次又一次地编写php。

答案 1 :(得分:0)

开始为用户提供有关如何提高其堆栈溢出公民资格的培训还为时过早。因此,在我开始解决这个问题之前,我想解释一下为什么您的问题不太适合Stack Overflow。

您已发布“需求转储”。您已经提供了一些输入数据和预期的输出,但是没有花力气。我的意思是,您已经证明了自己知道如何循环和回显,但是除了条件表达式之外,还没有任何尝试生成最小值/最大值的尝试。这意味着您没有足够的研究和尝试。

事实是,您的问题由几种基本技术组成(这使您的问题“过于广泛/需要更多关注”)—所有这些都是关于堆栈溢出的重复问题。即使Stack Overflow没有至少有5个单独的页面专门介绍每种基本技术,php手册也会为您提供足够的信息来解决此问题。

  1. 如何将一列数据从结果集中隔离到一个平面数组中
  2. 如何在数组中找到最小值和最大值
  3. 如何有条件地设置元素样式

您会看到,如果您已发布代码以表明您知道如何成功完成所有这些子任务,那么您将拥有正常工作的代码。如果您拥有有效的代码,但想知道是否可以对其进行完善,那么您有一个问题可以视为代码审查中的一个问题。

如果您发现自己被上面列出的一种基本技术所困扰,则有责任在代码中准确地识别出您所困的地方,从而使您的问题不再是“过于宽泛”。对于这个特定问题,如果您只想使用其中一种技术,我们可以通过提供重复的页面来解决您的问题。这是Stack Overflow的理想之选,因为我们能够解决您的问题,而无需在网站上生成任何不必要/多余的页面(您赢了,Stack Overflow获胜,更少的志愿者浪费时间阅读新的重复问题)。

关于解决您的问题,将有几种不同的方式来实现您所需要的。我建议将“处理代码”与“显示代码”分开。在专业应用程序中,您不会在与显示代码相同的文件中处理代码。 (最常见/趋势结构之一是MVC-在模型中收集数据,然后准备数据并通过Controller传递到View。)

此外,您应该尝试使用尽可能少的html标记。您使用的标签越少,就越容易管理/设置标签样式。使用class而不是嵌入式样式来提供更简洁的完成脚本。名为table的标签上的类似table的类不是很有信息,它应该以独特的方式说明它将具有什么样的样式或行为。如果文档中所有<table>标记都带有class="table"声明,则只需将其完全删除并在CSS中使用table选择器即可。如果您的表有一些特殊之处,请使用语义语言进行说明。

有很多方法可以对此进行编码。如果您喜欢函数式编码样式,则为了清楚起见,可以使用array_column()min()max()。如果您希望通过微优化来提高性能/简化计算,则可以使用带有迭代条件的循环来得出最小值和最大值。

您还应该考虑最小值与最大值相同的真实可能性。在这种情况下,应使用哪种颜色/等级?我只能随意猜测,因此我的代码段将为最大值赋予样式优先级。

这是解决问题的一种方法:

$details['Rear Camera Megapixels']['values'] = array_column($result, 'rear_camera');
$details['Rear Camera Megapixels'][min($details['Rear Camera Megapixels']['values'])] = 'minValue';
// max will potentially overwrite the min element
$details['Rear Camera Megapixels'][max($details['Rear Camera Megapixels']['values'])] = 'maxValue';
$details['Front Camera Megapixels']['values'] = array_column($result, 'front_camera');
$details['Front Camera Megapixels'][min($details['Front Camera Megapixels']['values'])] = 'minValue';
// max will potentially overwrite the min element
$details['Front Camera Megapixels'][max($details['Front Camera Megapixels']['values'])] = 'maxValue';

<table class="table">
    <thead>
        <tr>
            <th colspan="<?php echo count($result) + 1; ?>">Camera</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($details as $spec => $data) { ?>
            <tr>
                <th><?php echo $spec; ?></th>
                <?php foreach ($data['values'] as $value) {
                     printf(
                         '<td%s>%s</td>',
                         isset($data[$value]) ? " class=\"{$data[$value]}\"" : '',
                         $value
                     );
                } ?>
            </tr>
        <?php } ?>
    </tbody>
</table>

然后在您的外部.css文件中,您将具有类似于以下内容的声明:

.table td.maxValue {
    background-color: green;
    color: darkgreen;
}
.table td.minValue {
    background-color: pink;
    color: red;
}
相关问题