PHP foreach循环逐值判断实现表格Yes/No红绿着色问题求解
问题说明
需要优化数据库输出的HTML表格可读性,规则为:表格中值为Yes的内容显示为绿色,值为No的内容显示为红色,表格行通过foreach循环渲染。
原始表格结构示例:
Test1 | Test2 ... --------------- Yes | No ... Yes | Yes ... No | Yes ... Yes | No ...
原代码存在的核心问题:
- 循环过程中重复输出完整
<html>、<head>标签和全局CSS类定义,浏览器解析时会以最后一次定义的类样式为准,导致所有同类型单元格颜色完全由最后一条数据的判断结果决定,无法逐元素独立着色 - 测试用的索引数组结构和实际PDO查询返回的关联数组结构不匹配,会导致单元格取值异常
原代码配套的数据库查询逻辑无需修改,可直接复用:
// 连接MySQL数据库 $pdo = pdo_connect_mysql(); $page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1; $records_per_page = 8; $stmt = $pdo->prepare('SELECT * FROM contacts ORDER BY date LIMIT :current_page, :record_per_page'); $stmt->bindValue(':current_page', ($page-1)*$records_per_page, PDO::PARAM_INT); $stmt->bindValue(':record_per_page', $records_per_page, PDO::PARAM_INT); $stmt->execute(); $contacts = $stmt->fetchAll(PDO::FETCH_ASSOC); $num_contacts = $pdo->query('SELECT COUNT(*) FROM contacts')->fetchColumn();
修正后实现代码
核心调整点:
- 公共CSS样式统一放到页面
<head>区域,全局定义一次即可,禁止在循环内重复输出HTML基础结构和全局样式 - 渲染每个单元格时,直接判断当前单元格的实际值,动态挂载对应颜色的类名,不做全局样式覆盖
- 适配PDO返回的关联数组结构,逐列取值判断
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>数据表格</title> <style> /* 全局统一定义颜色类,仅声明一次 */ .text-green { color: green; font-weight: bold; } .text-red { color: red; font-weight: bold; } table { border-radius: 10px; overflow: hidden; background: #fff; box-shadow: 5px 5px 5px #dfdfdf; border-collapse: collapse; } td, th { padding: 8px 12px; border: 1px solid #eee; } </style> </head> <body> <table class="shadow"> <thead> <tr> <th style="width: 180px;">Test1</th> <th style="width: 105px;">Test2</th> <th style="width: 100px;">Test3</th> <th style="width: 80px;">Test4</th> <th style="width: 80px;">Test5</th> <th style="width: 98px;">Test6</th> </tr> </thead> <tbody> <?php foreach ($contacts as $contact): ?> <tr> <!-- 逐单元格判断值,挂载对应样式类 --> <td> <strong class="<?= $contact['test1'] == 'Yes' ? 'text-green' : 'text-red' ?>"> <?= $contact['test1'] ?> </strong> </td> <td> <strong class="<?= $contact['test2'] == 'Yes' ? 'text-green' : 'text-red' ?>"> <?= $contact['test2'] ?> </strong> </td> <td> <strong class="<?= $contact['test3'] == 'Yes' ? 'text-green' : 'text-red' ?>"> <?= $contact['test3'] ?> </strong> </td> <td> <strong class="<?= $contact['test4'] == 'Yes' ? 'text-green' : 'text-red' ?>"> <?= $contact['test4'] ?> </strong> </td> <td> <strong class="<?= $contact['test5'] == 'Yes' ? 'text-green' : 'text-red' ?>"> <?= $contact['test5'] ?> </strong> </td> <td> <strong class="<?= $contact['test6'] == 'Yes' ? 'text-green' : 'text-red' ?>"> <?= $contact['test6'] ?> </strong> </td> </tr> <?php endforeach; ?> </tbody> </table> </body> </html>
如果不想单独定义CSS类,也可以直接给元素加内联样式,逻辑完全一致:
<td> <strong style="color: <?= $contact['test1'] == 'Yes' ? 'green' : 'red' ?>; font-weight: bold;"> <?= $contact['test1'] ?> </strong> </td>
如果数据库里存储的值不是
Yes/No,而是类似测试代码里的J/N这类映射值,只需要把判断条件里的对比值替换成实际存储的枚举值即可。
内容的提问来源于stack exchange,提问作者AWH Games
相关产品推荐
相关产品推荐

