如何根据用户选择的注册颜色展示对应表格结构
核心问题梳理
你现有代码的问题主要集中在表格行的生命周期管理逻辑上:
- 仅做了行开启判断,没有处理颜色变化时的行闭合逻辑,也没有在循环结束后补全剩余未闭合的行标签
- 存在未定义的无效变量
$prevRegla、$nextRegla - 末尾多余拼接了无效的
</td>标签 - 行开启判断条件不符合业务需求
修正后代码(默认实现「同颜色ID放同一行,不同颜色换行;黄、绿颜色每个ID单独占一行」的逻辑,可根据实际需求调整判断条件)
function register() { $data = $this->sample->register1(); $prevColor = ''; $output = '<table style="margin-top: 5px;" id="display">'; foreach ($data as $f) { $currentColor = $f['registercolor']; // 匹配颜色对应的样式类 switch ($currentColor) { case RED: $btn = "bg-danger"; break; case BLUE: $btn = "bg-primary"; break; case GREEN: $btn = "bg-success"; break; case YELLOW: $btn = "bg-warning"; break; default: $btn = "bg-primary"; break; } // 判断是否需要开启新行:首次循环/颜色和上一个不同/当前是黄/绿色 $needNewRow = false; if ($prevColor === '') { $needNewRow = true; } elseif ($prevColor !== $currentColor) { $needNewRow = true; // 先闭合上一行 $output .= '</tr>'; } elseif (in_array($currentColor, [YELLOW, GREEN])) { $needNewRow = true; // 黄绿要求单独一行的话,先闭合上一行 $output .= '</tr>'; } if ($needNewRow) { $output .= '<tr>'; $prevColor = $currentColor; } // 拼接当前单元格 $output .= '<td h-align="top"><span data-toggle="tooltip" class="badge '.$btn. '" style="font-size: 1.6em; margin: .05em; border-radius: 30px;">'.$f['registerID'].'</span></td>'; } // 补全最后一行的闭合标签 $output .= '</tr></table>'; echo json_encode($output); }
额外优化建议
如果需要更高的可维护性,建议把前端HTML拼接逻辑移到视图层实现,控制器只负责返回结构化的颜色+注册ID数据,前端拿到数据后再渲染表格,后续调整样式会更方便。
内容的提问来源于stack exchange,提问作者Satten Kun
相关产品推荐
相关产品推荐

