面试之PHP数组引用

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

  • 变量赋值
1
2
3
4
5
6
<?php
$a = 0;
$b = &$a;
$c = $b;
$c = 90;
echo $a . '------' . $b . PHP_EOL; //输出 $a =0 ; $b = 0; $c并不参与引用
  • 数组引用赋值给变量
1
2
3
4
5
6
7
8
9
10
11
12
<?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() 来将其销毁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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]