最简方案是foreach拼接html字符串,需初始化$ul开头、循环内用htmlspecialchars转义、结尾补闭合标签;空数组应返回提示而非空;性能敏感时宜批量转义。

foreach 循环里直接拼接 HTML 字符串最简单
多数情况下,你不需要额外模板引擎或复杂渲染逻辑。PHP 的 foreach 配合字符串拼接就能干净生成 <ul><li></ul> 结构,关键是要避免在循环内多次 echo 或混用输出缓冲——这会让逻辑松散、难调试。
常见错误是把 <ul></ul> 和 放在循环里,导致每项都套一层列表;或者忘记对数组元素做 htmlspecialchars() 转义,引发 XSS。
- 先初始化空字符串:
$html = '<ul>';</ul> - 循环中追加
<li>项,内容用htmlspecialchars($item)处理 - 循环结束后补上
echo $html; 或返回该字符串用 heredoc + foreach 构建多行 HTML 更易读
当列表项 HTML 结构稍复杂(比如带 class、data 属性或嵌套标签),硬拼字符串很快变混乱。这时用 heredoc 在循环体内组织结构,可读性明显提升,且 PHP 变量插值自然。
注意:heredoc 中的变量名必须不含空格或特殊符号,$item['name'] 这类需提前赋值给简单变量(如 $name = $item['name'];),否则插值失败。
foreach ($items as $item) {
$name = htmlspecialchars($item['name'] ?? '');
$id = (int)$item['id'];
$html .=
<span>$name</span>
HTML;
}
$html = '
- ' . $html . '
遇到空数组时要主动处理,别让页面出现空
前端看到空的 <ul></ul> 往往意味着数据异常或接口出错,但后端常忽略这点。真实场景中,空数组应导向「无数据」提示,而不是静默渲染空列表。
- 检查
count($items) === 0,直接返回<p class="empty">暂无项目</p> - 如果设计要求必须有
<ul></ul>标签,至少加class="empty"方便 CSS 控制样式 - 避免在模板层再判断 —— PHP 层就该决定最终输出什么 HTML 片段
性能敏感场景下避免在循环里调用 htmlspecialchars() 多次
如果 $items 是上千条记录,每次循环都调用 htmlspecialchars() 会带来可观开销。更优做法是提前批量转义,或改用更轻量的替代方案(如只过滤 、<code>>、&)。
- 批量转义:
$safe_items = array_map('htmlspecialchars', $items);,之后循环用$safe_items - 若确定数据只含 ASCII 文本,可用正则快速替换:
preg_replace('/[&"\']/', '', $item)(不推荐用于用户输入) - 注意:
htmlspecialchars()默认不处理单引号,如需兼容属性值,得加ENT_QUOTES标志
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











