我在以下速度模板的foreach循环中遇到了一个非常奇怪的行为:
<html>
<body>
<table>
#set( $arrayOfArray = [[1]] )
#set( $new_arrOfArray = [] )
#set( $new_arr = [] )
<tr><td>Line 9</td><td>arrayOfArray: $arrayOfArray</td></tr>
#foreach ($arr in $arrayOfArray)
<tr><td>Line 11</td><td>arrayOfArray: $arrayOfArray</td></tr>
#set( $new_arr = $arr )
<tr><td>Line 13</td><td>arrayOfArray: $arrayOfArray</td></tr>
#if ($new_arr.add([ true ])) #end
<tr><td>Line 15</td><td>arrayOfArray: $arrayOfArray</td></tr>
#if ($new_arr.add([5,6])) #end
<tr><td>Line 17</td><td>arrayOfArray: $arrayOfArray</td></tr>
#if ($new_arrOfArray.add($new_arr)) #end
<tr><td>Line 19</td><td>arrayOfArray: $arrayOfArray</td></tr>
#end
<tr><td>Line 21</td><td>arrayOfArray: $arrayOfArray</td></tr>
</table>
</body>
</html>
正如您所看到的,我循环遍历一个数组数组(为了简单起见,我在这个例子中只将一个数组放入$ arrayOfArray中,但现实生活当然更复杂)。
正如您还可以从代码中看到的那样,我根本不操作变量$ arrayOfArray。但是,代码生成以下输出:
第9行arrayOfArray:[[1]]
第11行arrayOfArray:[[1]]
第13行arrayOfArray:[[1]]
第15行arrayOfArray:[[1,[true]]]
第17行arrayOfArray:[[1,[true],[5,6]]]
第19行arrayOfArray:[[1,[true],[5,6]]]
第21行arrayOfArray:[[1,[true],[5,6]]]
所以,似乎每当我向$ new_arr添加一个新的数组元素时,变量$ arrayOfArray也会被更新。
有人能够解释这种行为吗?
任何帮助高度赞赏。
安德烈亚斯
答案 0 :(得分:1)
我有点不确定你需要做什么。克隆会有帮助吗?替换
#set( $new_arr = $arr )
通过
#set( $new_arr = $arr.clone() )
将保持你的$ arrayOfArray不变,而$ new_arrOfArray最后将是[[1,[true],[5,6]]]。
但也许我在这里错过了一些观点......
答案 1 :(得分:0)
按#set( $new_arr = $arr )
,您将$new_arr
设置为{em>参考至$arr
。
$arr
是某个索引的{em>引用到$arrayOfArray
。
致电new_arr.add()
后,您就可以通过引用来呼叫$arrayOfArray[$someIndex].add()
。