PHP函数调用与直接执行代码结果不一致的解决方法
问题分析与解决方案
你遇到的问题根源在于PHP中数组默认是值传递,同时函数里还有一个未定义变量的问题,咱们一步步来解决:
1. 核心原因:数组的传值方式
当你把$arr2传入assignNilai函数时,PHP默认会创建一个数组的副本,函数内部修改的只是这个副本,并不会影响外部的原数组。而你直接执行代码时,是直接操作原数组本身,所以两者结果不同。
另外,函数里用到的$csp变量没有定义也没有作为参数传入,这会导致报错,也会影响逻辑执行。
2. 解决方案一:使用引用传递
在函数的$arr2参数前加上&符号,让函数接收的是原数组的引用,这样函数内部的修改会直接作用到外部的原数组。同时把$csp作为参数传入函数(如果它是外部定义的变量)。
修改后的代码如下:
$arr1 = array( 0 => array( "id" => 5, "SKS" => 2, "assignStatus" => 0 ) ); $arr2 = array( 0 => array( 0 => array( 0 => array( 0 => "", //draft 1 => "", //sks 2 => 0 //count3sks ) ) ) ); // 假设$csp是和$arr2结构相同的数组,这里先初始化一个示例 $csp = array( 0 => array( 0 => array( 0 => array( 0 => "", 1 => "", 2 => 0 ) ) ) ); // 通过函数执行(使用引用传递) assignNilai($arr2, 0, 0, 0, $arr1, 0, $csp); echo $arr2[0][0][0][0]." ".$arr2[0][0][0][1]." ".$arr2[0][0][0][2]; echo "<br>"; // 直接执行代码 $arr2[0][0][0][0] = $arr1[0]['id']; $arr2[0][0][0][1] = $arr1[0]['SKS']; if ($arr2[0][0][0][1]==3) { $arr2[0][0][0][2] = $csp[0][0][0][2] + 1; } echo $arr2[0][0][0][0]." ".$arr2[0][0][0][1]." ".$arr2[0][0][0][2]; // 修改后的函数:添加引用符号&,传入$csp参数 function assignNilai(&$arr2, $hari, $sesi, $ruang, $arr1, $draft, $csp){ $arr2[$hari][$sesi][$ruang][0] = $arr1[$draft]['id']; $arr2[$hari][$sesi][$ruang][1] = $arr1[$draft]['SKS']; if ($arr2[$hari][$sesi][$ruang][1]==3) { $arr2[$hari][$sesi][$ruang][2] = $csp[$hari][$sesi][$ruang][2] + 1; } }
3. 解决方案二:让函数返回修改后的数组
如果不想用引用传递,可以让函数处理完数组后返回修改后的数组,然后外部将返回值重新赋值给$arr2。这种方式更符合纯函数的特性,不会直接修改外部变量,减少意外副作用。
修改后的代码示例:
$arr1 = array( 0 => array( "id" => 5, "SKS" => 2, "assignStatus" => 0 ) ); $arr2 = array( 0 => array( 0 => array( 0 => array( 0 => "", //draft 1 => "", //sks 2 => 0 //count3sks ) ) ) ); $csp = array( 0 => array( 0 => array( 0 => array( 0 => "", 1 => "", 2 => 0 ) ) ) ); // 通过函数执行:接收返回的修改后数组 $arr2 = assignNilai($arr2, 0, 0, 0, $arr1, 0, $csp); echo $arr2[0][0][0][0]." ".$arr2[0][0][0][1]." ".$arr2[0][0][0][2]; echo "<br>"; // 直接执行代码 $arr2[0][0][0][0] = $arr1[0]['id']; $arr2[0][0][0][1] = $arr1[0]['SKS']; if ($arr2[0][0][0][1]==3) { $arr2[0][0][0][2] = $csp[0][0][0][2] + 1; } echo $arr2[0][0][0][0]." ".$arr2[0][0][0][1]." ".$arr2[0][0][0][2]; // 修改后的函数:返回处理后的数组 function assignNilai($arr2, $hari, $sesi, $ruang, $arr1, $draft, $csp){ $arr2[$hari][$sesi][$ruang][0] = $arr1[$draft]['id']; $arr2[$hari][$sesi][$ruang][1] = $arr1[$draft]['SKS']; if ($arr2[$hari][$sesi][$ruang][1]==3) { $arr2[$hari][$sesi][$ruang][2] = $csp[$hari][$sesi][$ruang][2] + 1; } return $arr2; // 返回修改后的数组 }
注意事项
- 一定要确保
$csp变量在函数内是可访问的,优先选择参数传递的方式,避免使用全局变量(全局变量会降低代码的可维护性)。 - 引用传递适合需要直接修改原数组的场景,但要注意可能带来的意外修改;返回数组的方式更安全,适合追求代码纯净性的场景。
内容的提问来源于stack exchange,提问作者Felix Candra
相关产品推荐
相关产品推荐

