foreach & 的坑

例1.foreach & as 变量不一样(正常结果)

<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
    $val += 1;
    var_dump($val);
}

echo "#############\n";

foreach ( $arr as $aa) {
    var_dump($aa);
}
$ php test.php 
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(56)

例2.foreach & as 变量一样(不期望的结果)

<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
    $val += 1;
    var_dump($val);
}

echo "#############\n";

foreach ($arr as $val) {
    var_dump($val);
}

执行结果:

$ php test.php 
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(45)
<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
    $val += 1;
    var_dump($val);
}

echo "#############\n";

foreach ($arr as $val) {
    var_dump($val);
}

执行结果:

$ php test.php 
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(45)

例3.foreach & as &变量一样(期望的结果)

<?php
$arr = [11, 22, 33, 44, 55];
foreach ($arr as &$val) {
    $val += 1;
    var_dump($val);
}在这里插入代码片

echo "#############\n";

foreach ($arr as &$val) {
    var_dump($val);
}

执行结果:

$ php test.php 
int(12)
int(23)
int(34)
int(45)
int(56)
#############
int(12)
int(23)
int(34)
int(45)
int(56)

解释说明

例1,就是正常期望的结果,不多解释。
例2,第一遍foreach 结束后, $val 指向空间 $arr[‘4’]; 再次循环的时候 ,相当于如下过程:

$val = $arr['4'] = $arr['0'] = 12;
$val = $arr['4'] = $arr['1'] = 23;
$val = $arr['4'] = $arr['2'] = 34;
$val = $arr['4'] = $arr['3'] = 45; //(关键步骤)
$val = $arr['4'] = $arr['4'] = 45;

例3,第一遍foreach结束后, $val 指向空间 $arr[‘4’]; 再次循环的时候,& $val 相当于一个新的空间,故而不会发生覆盖的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
list.forEach方法有一个常见的,就是在forEach的回调函数中,无法使用await关键字来等待异步操作的完成。这是因为forEach方法是通过委托来执行回调函数的,而委托无法使用await关键字。 在引用中的代码示例中,如果在itemList.ForEach的回调函数中使用了await关键字,会导致并发问题。为了解决这个问题,可以将forEach方法替换为foreach关键字,并使用异步方法进行处理。修改后的代码如下所示: public async Task Do() { var itemList=new List<X>(); foreach(var item in itemList) { await Add(item); } } 在这个示例中,我们使用foreach循环来遍历itemList,确保了在每次迭代中都能够等待Add方法的异步操作完成。 此外,引用中的示例代码也展示了另一个forEach。在forEach的回调函数中,this指向的是当前迭代的元素,而不是外部的作用域。因此,在这个示例中,如果想要访问外部的this对象,需要使用箭头函数或者在forEach回调函数中缓存this对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [linq ForEach中遇到的](https://blog.csdn.net/kerojiang/article/details/124488586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [forEach函数使用的时候遇到的](https://blog.csdn.net/qq_46617584/article/details/126229677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值