You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter中foreach循环传对象至视图,为何二次迭代仍输出2?

问题原因与解决方案

问题本质

这不是对象内存地址共享的问题,而是CodeIgniter视图加载的变量复用机制导致的:
当调用$this->load->view()时,传递的变量会被存入视图的全局变量池,而非每次加载都清空变量池。第一次加载view2时,你传入了包含$b=2的对象,变量$b被存入变量池;第二次加载view2时未传递任何变量,视图会直接复用变量池中已存在的$b,因此仍然输出2。

代码问题拆解

  • 控制器中$result的定义存在语法细节:将数组强制转为对象时,数组索引会成为对象的属性名,因此$result实际是包含->0和->1两个属性的对象,这部分可正常遍历,但不是核心问题。
  • view1中第二次加载view2时未传递变量,导致视图复用旧变量。

修复方案

方案1:每次加载视图时明确传递变量(推荐)

修改view1的循环逻辑,无论是否有数据都传递变量,覆盖旧值:

<?php 
    foreach($result as $index => $res) {
        // 每次都传递变量,无数据时传空数组清空旧变量
        $this->load->view("view2", $res ?? []);
    }
?>

方案2:在view2中检查变量是否存在

修改view2,避免输出未定义的旧变量:

echo isset($b) ? $b : '';

方案3:重置视图变量池

如果需要彻底清空之前的变量,可以在加载视图前调用$this->load->clear_vars():

<?php 
    foreach($result as $index => $res) {
        $this->load->clear_vars(); // 清空之前的视图变量
        $this->load->view("view2", $res ?? []);
    }
?>

内容的提问来源于stack exchange,提问作者D L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:43:09