关于foreach的一些思考

以下代码输出的结果分别是?
 $a = ['one', 'two', 'x'=>'y', 'a'=>'long']; 
 $val = 'si'; 
 foreach ($a as &$val) { 
     $val = $val . 'x'; 
} 
 var_dump($val); 

-------------------- 

$a = ['one', 'two', 'x'=>'y', 'a'=>'long']; 
$val = 'si'; 
foreach ($a as &$val) { 
     $val = $val . 'x'; 
} 
$val = 'sijiao'; 
$val = $val . 'mao'; 
var_dump($val);

答案测一下就可以得到了~
原因是: foreach在循环结束后仍然会保留最后一个val值,为防止出现意想不到的情况、可以unset掉


另外:可以思考一个问题~
function one($arr) {
    foreach($arr as $val) {
        echo $val;
    }
}

function two($arr) {
    foreach($arr as &$val) {
        echo $val;
    }
}

$a = array( 'a', 'b', 'c' );
one($a);
two($a);
谁的效率会更高、重要的是为什么?

可以参考下:
one函数:
1. 将一个数组作为参数、本身是非引用传递、所以数组知道不用考虑原数组的修改
2.foreach时、非引用传递、无需修改外部数组,它会复制数组的内部迭代偏移状态(很小的数字)不会有性能或内存占用问题
3. 它使用迭代偏移来遍历数组的所有键值对,当前偏移量的值分配给一个$val的变量
4. $val 是否复制该值? 不会、、是重新利用内存中现有值,除非发生修改、否则不会创建任何副本、修改时会在内存中分配一个新的zval、赋值给$val

two函数
1. 函数参数本身不允许修改外部参数
2. foreach时传入引用&、php为保证外部参数的值、只能重新复制一份,所以在开始迭代前就完整的复制了一份原数组


思考三:
$arr = range(0,100000);
for($i = 0; $i < 1000; $i++) {
    foreach($arr as $val) { // Normal Variable
         $val = $val + 1;
    }
}
var_dump($val);

------------
$arr = range(0,100000);
for($i = 0; $i < 1000; $i++) {
    foreach($arr as &$val) { // Reference To Value
        $val = $val + 1;
    }
}

var_dump($val);

得到的val值分别是多少?

参考:
100001100100

猜你喜欢

转载自blog.csdn.net/njys1/article/details/79146480