CodeIgniter中数组无法动态添加值问题:跨函数赋值失效排查
问题分析与解决方案
你遇到的核心问题是PHP数组的默认传递机制——PHP中数组默认是「值传递」,也就是说你把$ChnCat_tags传给second_function时,函数拿到的只是原数组的一个副本,你在函数里对数组的修改只会作用于这个副本,根本不会影响到类成员变量里的原数组。而且就算函数返回了修改后的副本,你在first_function里也没把返回值赋值给原变量,等于白忙活了。
接下来给你两种可行的解决方案,选哪种都能解决问题:
方案1:使用引用传递修改原数组
在函数参数前加&符号,让函数直接操作原数组的引用,这样修改就会同步到原变量上:
public $ChnCat_tags = array(); function first_function() { // 你的业务代码 $this->ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); // 传递数组的引用给second_function $this->second_function($this->ChnCat_tags); return $this->ChnCat_tags; // 现在会包含两个函数添加的所有值 } // 参数前的&表示接收数组的引用 function second_function(&$ChnCat_tags) { // 你的业务代码 $ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); // 递归调用也要传递引用,记得加终止条件! if(/* 这里加你的递归终止条件,比如没有子节点了 */) { return; } $this->second_function($ChnCat_tags); }
方案2:直接操作类成员变量(更推荐)
既然$ChnCat_tags是类的公共属性,完全没必要把它当参数传来传去,直接在两个函数里用$this->ChnCat_tags操作同一个数组就行,这也是CodeIgniter类中共享状态的规范写法:
public $ChnCat_tags = array(); function first_function() { // 你的业务代码 $this->ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); $this->second_function(); return $this->ChnCat_tags; } function second_function() { // 你的业务代码 $this->ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); // 一定要加递归终止条件,避免无限递归! if(/* 比如:当前节点没有子分类了 */) { return; } $this->second_function(); }
额外提醒
别忘记给递归函数加上终止条件!你原代码里完全没写判断逻辑,这样会导致无限递归,触发PHP的递归深度限制错误,这点一定要注意。
内容的提问来源于stack exchange,提问作者Agha
相关产品推荐
相关产品推荐

