CI3视图中不存在自动变量$data,控制器传递的数组键名直接转为变量名;循环前须用is_array()和!empty()双重判断;字段访问需匹配数据结构(数组用[]、对象用->);复杂逻辑应前置到控制器处理。

视图里直接用 $data 变量名循环?别这么干
CodeIgniter 3 的视图中,不会自动出现一个叫 $data 的变量。控制器传进来的数组,它的每个键(key)会变成独立变量。比如控制器里写 $this->load->view('list', ['users' => $userArray]),那视图里能直接用的变量是 $users,不是 $data['users']。误以为有 $data 容易报 “undefined variable” 错误。
foreach 循环前先确认数组不为空且是数组类型
常见错误是没检查就直接 foreach($users as $u),结果 $users 是 null 或 false(比如查询失败),PHP 会抛出 Warning:Invalid argument supplied for foreach()。
- 用
is_array($users) && !empty($users)做双重判断最稳妥 - 如果模型返回的是对象(如用了
row()),foreach会直接报错,必须确保是数组(result_array()或result()+ 手动转) - CI3 默认
result()返回对象数组,result_array()才返回关联数组,注意选对
循环输出时字段访问要匹配数据结构
假设模型里这样查:$this->db->select('id, name, email')->get('users')->result_array(),那每个 $u 就是形如 ['id' => 1, 'name' => 'Alice', 'email' => 'a@b.c'] 的关联数组。字段名必须和 select() 或数据库列名完全一致,大小写敏感。
容易踩的坑:
- 写了
$u->name(对象语法),但实际是数组 → 改成$u['name'] - 数据库字段是
user_name,却在视图里写$u['name']→ 报 “undefined index” - 用了
select('COUNT(*) as total'),结果只有一行,不能直接foreach,得用$total = $users[0]['total']或改用row_array()
避免在视图里做复杂逻辑,尤其是嵌套循环或条件分支
CI3 视图不是 PHP 脚本容器。虽然语法上允许写 if、foreach,但一旦出现多层嵌套或需要调用模型方法,说明数据组织出了问题——该在控制器里预处理好,而不是让视图去拼接、过滤、分组。
例如:要按状态分组显示用户,不要在视图里 foreach 一遍再 if ($u['status'] === 'active') 套一层;应该在控制器里用 group_by() 或 PHP 数组函数提前分好,传入 ['active' => [...], 'inactive' => [...]] 这样的结构。
真正难调试的,往往是那个忘了加 is_array() 判断、又恰好某次接口返回空数组的循环——它不会报错,只是页面一片空白,连 debug 都得翻控制器和模型来回比对。


















