面试之PHP数组引用

  1. 赋值引用

数组引用赋值给变量并不会将左边转换为引用,例:


  • 变量赋值
<?php
$a = 0;
$b = &$a;
$c = $b;
$c = 90;
echo $a . '------' . $b . PHP_EOL; //输出 $a =0 ; $b = 0; $c并不参与引用
  • 数组引用赋值给变量
<?php
$arr = [
'fi' => 1,
'ti' => 45
];

$b = &$arr['ti'];	//保留数组内部元素引用
$c = $arr;	//$c 不参与引用
$c['fi'] = 67;	//不会改变 $arr元素值
$c['ti'] = 56;	//$arr['ti'] 在上方有引用,故此处会改变 $arr['ti'] 值

var_export($arr); //$arr = ['fi' => 1, 'ti' => 56];
  1. foreach :每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步
  • 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。 由于 foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。

数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

<?php
//正例
$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {
    $value = $value * 2;
}
//[ 2, 4, 6, 8]
unset($value); // 最后取消掉引用

// 反例
$arr2 = [1, 3, 7];
$arr3 = [4, 6, 10, 12];
foreach($arr2 as &$row){}
foreach($arr3 as $row){}

var_export($arr2); //[1, 3, 12],没将 $row unset,一直处于引用赋值
var_export($arr3); //[4, 6, 10, 12]

黄铭博客
请先登录后发表评论
  • latest comments
  • 总共0条评论