php - Puisque foreach fonctionne sur une copie du tableau d'origine, pourquoi peut-il toujours modifier le tableau d'origine lorsqu'il est écrit comme ceci ?
三叔
三叔 2017-06-22 11:53:30
0
4
1094

La boucle foreach utilise une copie du tableau d'origine. Pourquoi le tableau d'origine peut-il être modifié après l'attribution de la référence ?

$aOriginArray为二维数组
Array
(
    [0] => Array
        (
            [test1] => 1
            [test2] => 2
        )
)
foreach($aOriginArray as &$aNewValue){
    //为原数组子数组添加一个元素
    $aNewValue['new'] = 3;
}
//经过foreach循环引用赋值方式修改数组后的结果
print_r($aOriginArray);
Array
(
    [0] => Array
        (
            [test1] => 1
            [test2] => 2
            [new]   => 3 
        )
)

Ce paragraphe peut prouver que l'opération foreach est une copie du tableau d'origine,
et que le tableau d'origine a été perdu à mi-chemin lors de la synchronisation. Le pointeur interne du tableau d'origine n'a bougé qu'une seule fois,
Les opérations ultérieures sont toutes effectuées sur la copie

.
$k = ['a','b','c'];

foreach($k as $t){
    echo "current:".current($k);
    echo "<br>";
    echo "foreach:".$t;
    echo "<br>";
}
输出的结果是:
current:b
foreach:a
current:b
foreach:b
current:b
foreach:c

Lors de l'utilisation de l'affectation de référence, la situation de référence du tableau est la suivante


xdebug_debug_zval("k");

k:
(refcount=2, is_ref=1),

数组的引用计数为2,说明有两个变量指向同一个数组,is_ref值为1,说明数组被引用
也就是说foreach在引用赋值时操作的是原数组,此时没有产生数组的拷贝
foreach的第一个参数为原数组的别名

foreach($k as &$t){
    ...
}

当使用foreach($k as $t){...}不加引用
数组的引用情况如下
k:
(refcount=1, is_ref=0),

原数组仅有一个符号在指向且未被引用

Merci beaucoup pour vos réponses patientes

三叔
三叔

répondre à tous(4)
给我你的怀抱

Après avoir ajouté le symbole &, vous n'utilisez pas de copie du tableau d'origine. Sans l'esperluette, il s'agit bien d'une copie du tableau d'origine. Ajouter l’esperluette équivaut à un pointeur, il suffit de lui attribuer le nom. Ainsi, si vous modifiez votre nouveau tableau, le tableau d'origine changera également.
Depuis PHP 5, il est facile de modifier les cellules d'un tableau en ajoutant & avant $value. Cette méthode attribue par référence plutôt que de copier une valeur.

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>
習慣沉默

Après avoir ajouté le symbole de passage d'adresse &, $aNewValue devient un pointeur vers chaque élément du tableau, ce qui équivaut à modifier le tableau d'origine

phpcn_u1582

Copies PHP lors de l'écriture, il utilise simplement un nouveau pointeur pour pointer vers la valeur lors de la copie,

Ty80

C'est une référence à une variable. Les deux variables pointent vers la même adresse. L'opération de copie modifie également le tableau d'origine

.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal