CodeIgniter递归函数中数组无法动态添加元素的问题排查
问题原因与解决方案
这问题我太熟了!核心原因是PHP里数组默认的值传递机制在搞鬼,咱们一步步拆解:
为什么function B无法修改原数组?
当你把$ChnCat_tags传给function B的时候,PHP会自动创建一个数组的副本。你在function B里对$ChnCat_tags做的所有修改,都是针对这个副本的,和function A里的原数组完全没关系。所以最后print_r的时候,只能看到A里添加的内容。
另外还要提一句:你原代码里有个语法错误——递归调用时的recursion_result少了美元符号$,得改成$recursion_result才行。
两种可行的解决方案
方案1:使用引用传递(推荐,适合递归场景)
给function B的参数加上&符号,告诉PHP我们要传递的是数组的引用,而不是副本。这样在B里修改数组时,直接作用于原数组:
function A() { $ChnCat_tags = array(); // some code $ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); B($ChnCat_tags); // 直接传引用,修改会同步到原数组 print_r($ChnCat_tags); } function B(&$ChnCat_tags) { // 参数前加&,启用引用传递 // some code $ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); // 递归调用时直接传引用即可 B($ChnCat_tags); // 可选:返回数组方便后续链式操作 return $ChnCat_tags; }
方案2:返回修改后的数组并重新赋值
如果你不想用引用,可以保持值传递,但每次递归后都把修改后的数组返回,再重新赋值给原变量:
function A() { $ChnCat_tags = array(); // some code $ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); // 把B返回的修改后数组重新赋值给原变量 $ChnCat_tags = B($ChnCat_tags); print_r($ChnCat_tags); } function B($ChnCat_tags) { // some code $ChnCat_tags[] = array( 'level' => $level, 'value' => $row_vct->id_vct, 'label' => $row_vct->displayname_vct, 'disable' => $disb ); // 递归时也要接收返回值并赋值 $ChnCat_tags = B($ChnCat_tags); return $ChnCat_tags; }
内容的提问来源于stack exchange,提问作者Agha
相关产品推荐
相关产品推荐

