关于foreach的引用&;

没用&之前,要改变数组中的元素是这样做的⬇️

$arr = array(1,2,3);
foreach ($arr as $k => $v){
    $arr[$k]=$v * 2;
}
// now $arr is array(2, 4, 6)

用了&,是这样的⬇️

$arr = array(1,2,3);
foreach($arr as $k => &$v) {
    $v = $v * 2;
}
// now $arr is array(2, 4, 6)

当用了&引用,记得要用unset($v)来将其销毁 ,或者及时改变变量名,否则会出现以下情况⬇️

$arr = array(1,2,3);
foreach($arr as $k => &$v) {
    $v = $v * 2;
}
// now $arr is array(2, 4, 6)


foreach($arr as $k => $v) {
    //第1遍循环,隐含操作$v=$arr[0]被触发,由于此时$v仍然是$arr[2]的引用,即相当于$arr[2]=$arr[0],$arr变成2,4,2
    //第2遍循环,$v=$arr[1],即$arr[2]=$arr[1],$arr变成2,4,4
    //第3遍循环,$v=$arr[2],即$arr[2]=$arr[2],$arr变成2,4,4
    echo "$k", " => ", "$v",'</br>';
}


### Java 中 `foreach` 的使用方法与变量引用详解 #### 1. 基本语法 Java 提供了一种简化形式的 `for` 循环,称为 **增强型 for 循环** 或者 **foreach 循环**。它主要用于遍历数组或者集合中的元素。其基本语法如下: ```java for (Type element : collection) { // 对 element 进行操作 } ``` 其中: - `Type` 是集合或数组中元素的数据类型。 - `element` 表示当前迭代到的单个元素。 - `collection` 可以是任何实现了 `Iterable` 接口的对象或者是数组。 此设计的主要目的是为了提高代码可读性和减少冗余代码[^1]。 --- #### 2. 避免引入新关键字的原因 尽管该循环被称为 &ldquo;foreach&rdquo;,但在实际实现中并未将其作为独立的关键字引入。这是为了避免破坏向后兼容性&mdash;&mdash;即防止现有程序因新增关键字而失效。例如,&ldquo;in&rdquo; 关键字可能会冲突于某些常用变量名(如 `System.in`),因此选择了冒号 (`:`) 来分隔循环变量和目标对象。 --- #### 3. 数据安全性保障 在 `foreach` 循环内部,参数是以值传递的方式传入的,这意味着无法通过修改局部变量来改变原始数据结构的内容。如果确实需要更新原集合,则应改用传统索引式的 `for` 循环[^2]。 下面展示了一个例子,说明如何利用临时副本完成转换而不影响源列表: ```java List&lt;String&gt; originalList = Arrays.asList(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;); List&lt;String&gt; upperCaseList = new ArrayList&lt;&gt;(); originalList.forEach(item -&gt; upperCaseList.add(item.toUpperCase())); upperCaseList.forEach(System.out::println); // 输出 A B C 而不会改动 originalList ``` 上述代码片段展示了如何创建一个新的列表并填充大版本字符串,从而保持原有数据不变。 --- #### 4. Velocity 模板引擎中的扩展应用 除了核心语言特性外,在一些框架比如 Apache Velocity 中也有类似的标签支持。例如 `$foreach` 标签允许开发者轻松处理模板渲染过程中的重复逻辑,并提供了内置计数器功能以便追踪当前位置[$velocityCount][^3]。 以下是简单的演示案例: ```html &lt;ul&gt; #foreach($item in $items) &lt;li&gt;$velocityCount: $item&lt;/li&gt; #end &lt;/ul&gt; ``` 在此处,每次迭代都会自动增加 `$velocityCount` 的数值,默认从 1 开始计算。 --- ### 总结 综上所述,Java 的 foreach 结构不仅简化了常见的遍历场景,还兼顾到了与其他组件之间的协作需求以及维护既有系统的稳定性考量。对于那些希望保护基础容器状态的应用场合而言尤为重要;而对于更复杂的交互则可能仍需依赖常规控制流程构建解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值