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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:29:42