这个 PHP foreach 循环是做什么的?(与创建对数组中每个元素的引用有关?


What does this PHP foreach loop do? (Something to do with creating references to each element in an array?)

>最近,我试图创建一个PHP数组的副本,除了我希望副本包含对值的引用,而不是包含值的数组的副本。
我这样做的主要动机是将 call_user_func_array 函数与 mysqli_stmt_bind_parammysqli_stmt_bind_result 函数结合使用,以创建一个用于处理预准备语句的包装函数。

在试图弄清楚如何做到这一点时,我遇到了以下代码:

$arr = array(1, 2, 3, 4); // The array to make a copy of with references
$ref_arr = array();       // The new array that will contain the references
foreach ($arr as $key => &$val) {
  $ref_arr[$key] = &$val;
}

上面的代码实际上通过创建与第一个数组相同的第二个数组来为我提供了我想要的东西,只是数组中的元素是对值而不是值本身的引用,但是,我不明白它是如何工作的。

我了解 & 符号 ( & ) 在 PHP 中的作用,但我不明白为什么 foreach 循环中的两个$val实例都必须引用为 &$val

如果有人能解释一下上面的foreach循环中到底发生了什么,我将不胜感激。
多谢。

第一个实例必须是引用。否则,您只会获得本地副本。请考虑以下代码:

$arr = array(1, 2, 3, 4); 
foreach ($arr as $val)
    $val = 5;
print_r($arr);

此代码仍将打印 1,2,3,4,因为您不会更改数组中的值,而是副本。

相同的逻辑适用于第二个实例。如果没有 &,它只会分配元素的当前值。

mysqli_stmt_bind_param()要求通过引用传递值。因此,该函数所做的只是创建一个引用原始数组中的值的数组。这让mysqli_stmt_bind_param高兴。这有点愚蠢,但这是我们必须做的,才能用mysqli_stmt_bind_param()来称呼call_user_func_array()

参考:请参阅手册以了解mysqli_stmt_bind_param()

mysqli_stmt_bind_param() 与 call_user_func_array() 结合使用时必须小心。请注意,mysqli_stmt_bind_param() 要求通过引用传递参数,而 call_user_func_array() 可以接受可以表示引用或值的变量列表作为参数。