Maison > Questions et réponses > le corps du texte
Après que foreach ait utilisé & pour parcourir le tableau arr2, il traverse à nouveau le tableau. Le résultat obtenu est très déroutant. Je me demande si un expert peut expliquer comment le pointeur de traversée & se déplace.
Le code est le suivant :
$arr2 = ['a','s','d'];
foreach ($arr2 as $k => &$v){
echo $k." ".$v."<br>";
}
//unset($v);
foreach ($arr2 as $k => $v){
echo $k." ";
echo $v." ".current($arr2)."<br>";
}
Résultat :
0 a
1 s
2 d
0 a a
1 s a
2 s a
Pourquoi le pointeur s'est-il arrêté lorsqu'il s'est déplacé vers s lors du deuxième parcours ?
迷茫2017-07-04 13:47:55
Ou vous pouvez faire ceci :
<?php
$arr2 = ['a','s','d'];
foreach ($arr2 as $k => &$v){
echo $k." ".$v.PHP_EOL;
}
while(current($arr2)) {
echo key($arr2).'->'.current($arr2).PHP_EOL;
next($arr2);
}
Sortie :
0 a
1 s
2 d
0->a
1->s
2->d
phpcn_u15822017-07-04 13:47:55
Encore une chose
foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动。
现在开始,不再如此,见下面代码。。
$array = [0, 1, 2];
foreach ($array as &$val)
{
var_dump(current($array));
}
PHP5运行的结果会打印int(1) int(2) bool(false)
PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变。
之前运行的结果会打印int(1), int(2)和bool(false)
我想大声告诉你2017-07-04 13:47:55
Raison :
Dans le premier
foreach
中采取了引用传递的方式,第一次循环$v
指向$arr2[0]
的存储空间,第二次指向>$arr2[1]
的存储空间,循环结束则指向$arr2[2]
espace de rangementDans le deuxième
foreach
中采取了值传递的方式,第一次循环给$v
赋值了a
,即给$arr2[2]
赋值了a
,第二次同上,$arr2[2]
的值变为了$arr2[1]
的值,则$arr2
变成了[a,s,s]
, le dernier élément du tableau devient donc la valeur de l'avant-dernier élément
Solution :
Dans le premier
foreach
结束后加一句unset($v)
;Deuxième fois
foreach
循环不用$v
Changez la variable avec un autre nom
Référence :
Le problème de l'utilisation de foreach pour changer la valeur d'un tableau en php
valeur d'objet de classe de tableau php passant la référence passant la différence