Question Existe-t-il une fonction permettant de copier un tableau PHP vers un autre?


Existe-t-il une fonction permettant de copier un tableau PHP vers un autre?

J'ai été brûlé quelques fois en essayant de copier des tableaux PHP. Je veux copier un tableau défini à l'intérieur d'un objet à un global en dehors de celui-ci.


434
2017-10-07 16:11


origine


Réponses:


En PHP, les tableaux sont assignés par copie, tandis que les objets sont assignés par référence. Cela signifie que:

$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);

Va céder:

array(0) {
}

Tandis que:

$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);

Rendements:

object(stdClass)#1 (1) {
  ["foo"]=>
  int(42)
}

Vous pourriez être confus par des complexités telles que ArrayObject, qui est un objet qui agit exactement comme un tableau. Étant un objet cependant, il a une sémantique de référence.

Edit: @AndrewLarsson soulève un point dans les commentaires ci-dessous. PHP a une fonction spéciale appelée "références". Ils sont quelque peu similaires à des pointeurs dans des langages comme le C / C ++, mais pas tout à fait pareil. Si votre tableau contient des références, alors que le tableau lui-même est transmis par copie, les références seront toujours résolues à la cible d'origine. C'est bien sûr le comportement souhaité, mais je pensais que cela valait la peine d'être mentionné.


790
2017-10-07 17:56



PHP va copier le tableau par défaut. Les références en PHP doivent être explicites.

$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a

152
2017-10-07 16:13



Si vous avez un tableau qui contient des objets, vous devez faire une copie de ce tableau sans toucher à son pointeur interne, et vous devez cloner tous les objets (pour ne pas modifier les originaux lorsque vous apportez des modifications à la copie) array), utilisez ceci.

L'astuce pour ne pas toucher le pointeur interne du tableau est de s'assurer que vous travaillez avec une copie du tableau, et non le tableau original (ou une référence à celui-ci), donc l'utilisation d'un paramètre de fonction fera le travail (ainsi, c'est une fonction qui prend dans un tableau).

Notez que vous devrez toujours mettre en œuvre __cloner() sur vos objets si vous souhaitez que leurs propriétés soient également clonées.

Cette fonction fonctionne aussi bien pour tout type de tableau (y compris les types mixtes).

function array_clone($array) {
    return array_map(function($element) {
        return ((is_array($element))
            ? call_user_func(__FUNCTION__, $element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}

38
2017-07-18 16:35



Quand tu fais

$array_x = $array_y;

PHP copie le tableau, donc je ne sais pas comment vous auriez pu le graver. Pour votre cas,

global $foo;
$foo = $obj->bar;

devrait bien fonctionner.

Pour être brûlé, je pense que vous auriez dû utiliser des références ou attendre que des objets à l'intérieur des tableaux soient clonés.


26
2017-10-07 16:13



array_merge() est une fonction dans laquelle vous pouvez copier un tableau dans un autre en PHP.


16
2017-12-08 07:56



Si vous n'avez que des types de base dans votre tableau, vous pouvez le faire:

$copy = json_decode( json_encode($array), true);

Vous n'aurez pas besoin de mettre à jour les références manuellement
Je sais que ça ne marchera pas pour tout le monde, mais ça a marché pour moi


8
2018-03-13 07:54



simple et fait une copie profonde briser tous les liens

$new=unserialize(serialize($old));

8
2017-11-04 21:26