2017-06-26 177 views
1

在下面我将尝试精确解释迭代在不同情况下的工作原理。 我不知道为什么 将元素添加到数组迭代在foreach语句中php

$arr=[1,2,3]; 
    $count=0; 
    foreach ($arr as $value){ \\ 
     echo "$value\n"; 
     if ($count++<10) $arr[]=$value+1; \\add new element 
    } 
    print_r($arr); 

结果

1 
2 
3 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 2 
    [4] => 3 
    [5] => 4 
) 

$arr=[1,2,3]; 
    $count=0; 
    foreach ($arr as &$value){ \\reference elemnt 
     echo "$value\n"; 
     if ($count++<10) $arr[]=$value+1; 
    } 
    print_r($arr); 

结果

1 
2 
3 
2 
3 
4 
3 
4 
Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 2 
    [4] => 3 
    [5] => 4 
    [6] => 3 
    [7] => 4 

或更好的问题是什么的foreach机制在PHP 感谢

回答

0

每一次迭代如果使用REFFERENCE你会得到与以前添加的元素阵列。你可以做下面看看它是如何工作的:

$arr=[1,2,3]; 
$count=0; 
foreach ($arr as &$value){ 
    if ($count++<10) $arr[]=$value+1; 
    print_r($arr); 
} 
0

基本上通过值的PHP数组进行遍历时,取数组的副本来遍历所以它只会做3个循环。如果您通过引用进行迭代,则它会遍历数组本身,这意味着您所做的更改会反映在循环中。

你的代码显示了这口井,还要考虑this code

<?php 
$arr=[1,2,3]; 
$count=0; 
foreach ($arr as $index => $value){ // 
    if (isset($arr[$index+1])) { 
     $arr[$index+1]++; 
    } 
    echo "$value\n"; 
} 
print_r($arr); 

打印:

1 
2 
3 
Array 
(
    [0] => 1 
    [1] => 3 
    [2] => 4 
) 

当你将它更改为:

<?php 
$arr=[1,2,3]; 
$count=0; 
foreach ($arr as $index => &$value){ // 
    if (isset($arr[$index+1])) { 
     $arr[$index+1]++; 
    } 
    echo "$value\n"; 
} 
print_r($arr); 

的变化会立即反映在循环,即它打印:

1 
3 
4 
Array 
(
    [0] => 1 
    [1] => 3 
    [2] => 4 
) 
+0

请问任何人都可以告诉我什么是在引擎盖下运行这些代码。 – Bagheri

+0

@Bagheri PHP是开源的,用C编写。如果你认为你可以处理它,那么你可以[查看源代码](https://github.com/php/php-src)。我无法帮助你。 – apokryfos