codeigniter视图中直接用原生foreach循环输出数组,需检查变量是否存在、使用html_escape()防xss,关联数组要写$key=>$value,空数组需提供默认值避免警告。

CodeIgniter 视图里用 foreach 循环输出数组最直接
CodeIgniter 的视图(.php 文件)本质就是 PHP 模板,不额外封装循环语法 —— 别找 loop 或 each 这类伪标签,直接写原生 foreach 就行。CI 并未重写 PHP 的语法逻辑,传进来的数组跟在普通 PHP 脚本里一样可用。
常见错误是试图用 CI 控制器里的写法(比如 $this->load->view('xxx', $data) 之后,在视图里还想着调用某个 CI 方法来遍历,结果报 Call to undefined function。
- 控制器中传递数组:
$data['users'] = ['Alice', 'Bob', 'Charlie']; $this->load->view('user_list', $data); - 视图中正确写法:
<?php foreach ($users as $name): ?><p><?php echo htmlspecialchars($name); ?></p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2515" title="CodeIgniter 4.7.0"><img src="https://img.php.cn/upload/manual/001/503/042/6a6b043218cde750.png" alt="CodeIgniter 4.7.0" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/gongju/2515" title="CodeIgniter 4.7.0" class="overflowclass">CodeIgniter 4.7.0</a> <p class="overflowclass">CodeIgniter下载页提供 CodeIgniter 4.7.0 官方源码包,并整理框架安装、数据库配置与入门开发说明。</p> </div> <a rel="nofollow" href="/xiazai/gongju/2515" title="CodeIgniter 4.7.0" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <?php endforeach; ?>
- 注意:必须用
htmlspecialchars()或html_escape()(CI 内置函数)防 XSS,尤其当数组内容来自用户输入
关联数组循环时记得用 $key => $value 语法
如果传的是键值对(比如数据库查询结果 result_array() 返回的二维数组),漏掉 $key => 会导致只拿到值、丢掉字段名,后续无法按列访问。
- 错误写法(只取值,丢失键):
foreach ($rows as $row) { echo $row['name']; }—— 实际上$row是一维数组,但没声明$key => $value会让 PHP 解析出错或报Undefined index - 正确写法:
<?php foreach ($users as $user): ?><div>姓名:<?php echo html_escape($user['name']); ?> </div> <div>邮箱:<?php echo html_escape($user['email']); ?> </div> <?php endforeach; ?>
- 如果需要索引序号,用
foreach ($array as $i => $item),$i是自动递增的数字键(即使原数组是字符串键也会被重映射)
空数组或未定义变量会触发 Invalid argument supplied for foreach()
这是视图中最常遇到的警告。CI 不会帮你判断变量是否存在或是否为数组,全靠你手动防御。
- 必须检查:
<?php if (is_array($items) && !empty($items)): ?> ... <?php endif; ?> - 更简洁写法(PHP 7+):
<?php foreach (($items ?? []) as $item): ?>——??提供默认空数组,避免警告 - 别依赖控制器“一定传了”,尤其在 AJAX 分页、搜索无结果等分支场景下,
$data['list']可能根本没设,或设成了null - 调试技巧:在视图开头加
<?php var_dump($users); exit; ?>快速确认结构和类型
性能上不用怕嵌套循环,但别在视图里做数据处理
视图层只负责展示,所有过滤、排序、分页计算都应在控制器或模型完成。有人习惯在视图里 array_filter() 或 usort(),这会让逻辑散落、难以测试,也容易因作用域问题出错。
- 正确分工:控制器查出全部数据 → 按需筛选/重组 → 传给视图纯展示数组
- 例如分页:不要在视图里用
array_slice($all, $offset, $limit),而应在模型里用limit()和offset() - 复杂格式化(如时间戳转中文日期)建议封装成辅助函数或视图助手,而不是在
foreach块里反复写date('Y-m-d', $row['created_at'])










