1

最近,我试图创建一个 PHP 数组的副本,但我希望副本包含对值的引用,而不是包含值的数组副本。
我这样做的主要动机是将该call_user_func_array函数与mysqli_stmt_bind_paramandmysqli_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 中的作用,但我不明白为什么$valforeach 循环中的两个实例都必须引用为&$val.

如果有人可以解释上面 foreach 循环中到底发生了什么,我将不胜感激。
非常感谢。

4

2 回答 2

2

mysqli_stmt_bind_param()需要通过引用传递值。因此,该函数所做的只是创建一个引用原始数组中的值的数组。这让人mysqli_stmt_bind_param高兴。这有点傻,但这是我们必须做call_user_func_array()mysqli_stmt_bind_param()

参考:见手册mysqli_stmt_bind_param()

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

于 2013-11-09T02:20:40.317 回答
2

第一个实例必须是参考。否则你只会得到一个本地副本。考虑这段代码:

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

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

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

于 2013-11-09T02:27:44.627 回答