小心 foreach 中使用引用,否则可能数据出错

有实例代码如下:

// 有一个产品分为标准版和高级版
$products = [
	'standard' => [
		'price' => 100, // 原价
		'discount' => 0.8, // 折扣
	],
	'advanced' => [
		'price' => 200,
		'discount' => 0.7,
	],
]; 

// 算出节省的金额
foreach ($products as &$product) {
	$product['save'] = $product['price'] * (1 - $product['discount']);
}

// 输出产品价格信息
foreach ($products as $product) {
	print_r($product);
}

 

运行,输出的结果却是:

$ php test_foreach.php
Array
(
    [price] => 100
    [discount] => 0.8
    [save] => 20
)
Array
(
    [price] => 100
    [discount] => 0.8
    [save] => 20
)

 

不知道看官您看出问题没有,找这个问题花了我老长时间,foreach 里面对值使用使用后,loop 结束,值还存在,所以在 foreach 循环结束后应手动 unset 该变量。

改正后的 PHP 代码为:

$products = [
	'standard' => [
		'price' => 100,
		'discount' => 0.8,
	],
	'advanced' => [
		'price' => 200,
		'discount' => 0.7,
	],
]; 

foreach ($products as &$product) {
	$product['save'] = $product['price'] * (1 - $product['discount']);
}
unset($product); // ******** <--注意这里!!! **********

foreach ($products as $product) {
	print_r($product);
}

 

php.net 上关于 foreach 里面使用引用的警告说明如下:

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().

1 评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注