Est-il une fonction pour faire une copie d'un tableau PHP à l'autre?
Est-il une fonction pour faire une copie d'un tableau PHP à l'autre?
J'ai été brûlé un peu de temps à essayer de copier les tableaux PHP. Je veux copier un tableau défini à l'intérieur d'un objet à un mondial à l'extérieur.
- vraiment la fin, mais dans mon Environnement, j'ai testé (et cela a fonctionné): fonction arrayCopy(array $a) { return $a; } $a1 = array(); for ($i=0; $i<3; $i++) { $a1["clé-$i"] = "valeur #$i"; } $a1["clé-sous-tableau"] = array(1, 2, 3, 4); $a2 = $a1; $a3 = arrayCopy($a1); for ($i=0; $i<3; $i++) { if (!is_array($a2["clé-$i"])) { $a2["clé-$i"] = "nouvelle valeur #$i"; } } $a2["clé-sous-tableau"] = array("a changé de sous-tableau 1", "changé sous-tableau 2"); var_dump($a1); var_dump($a2); var_dump($a3); Le truc, c'est, pour ne pas passer le tableau en tant que référence dans la fonction 😉
Vous devez vous connecter pour publier un commentaire.
Dans les tableaux PHP sont affectés par copie, tandis que les objets sont affectés par référence. Cela signifie que:
Donnera:
Considérant ce qui suit:
Rendements:
Vous pourriez obtenir confus par subtilités comme
ArrayObject
, qui est un objet qui agit exactement comme un tableau. Un objet, cependant, il est la référence de la sémantique.Edit: @AndrewLarsson soulève un point dans les commentaires ci-dessous. PHP dispose d'une fonction spéciale appelée "références". Ils sont un peu similaires à des pointeurs dans des langages comme le C/C++, mais pas tout à fait la même. Si votre tableau contient des références, alors que le tableau lui-même est passé par copie, les références sont encore à résoudre à l'objectif initial. C'est bien sûr généralement le comportement souhaité, mais j'ai pensé qu'il était utile de mentionner.
$copy = $original;
. Ce qui ne fonctionne pas si les éléments du tableau sont des références.php
nous présente le moins résultat attendu, parce que cette solution ne fonctionne pas toujours.$a=array(); $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
imprimearray0
tout$a=$GLOBALS; $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
imprimearray1
. Apparemment, certains tableaux sont copiés par référence.next()
et des fonctions similaires. Peut-être que maintenant vous voyez pourquoi j'ai dû faire ma propre réponse à cette question (et vous avez raison, c'était en quelque sorte un cas particulier, mais je le vois avoir l'utilisation de beaucoup d'autres à venir ici).foreach
oufor
. Sauf pour les micro-optimisations, je ne peux pas penser à un cas d'utilisation où il serait préférable d'utiliser lenext
,current
etc. constructions?next()
fonction, mais j'ai souvent besoin d'utiliser unwhile(list($key, $value) = each($array))
approche pour parcourir un tableau, qui ne déplacer l'interne pointeur sur le tableau après chaque itération (et que vous avez manuellementreset()
avant de commencer et lorsque vous avez terminé). Ma réponse est en raison de m'avoir besoin de cloner le tableau j'étais en train de parcourir, donc j'avais besoin de m'assurer que je n'ai pas toucher à l'interne pointeur sur le tableau (carforeach
déplace le pointeur interne, je ne pouvais pas l'utiliser pour le clone). Peut-être que je ne fais pas de sens, mais j'espère que vous voyez pourquoi j'ai fait ce que j'ai fait.$a_copy = $a;
". Jusqu'alors, @Reinis I. réponse obtient mon upvote.$a=[foo=>bar];$b=$a;$b[foo]=42;echo$a[foo];
imprimebar
; mais$a=[foo=>bar];$b=$a;$b->foo=42;echo$a[foo];
imprime42
. I. e.: affectation d'un tableau de variable à une autre variable ne va pas créer une copie instantanément (pour des raisons de performances); que si vous modifiez les valeurs - mais pas si vous utilisez la syntaxe objet.PHP va copier le tableau par défaut. Références en PHP doivent être explicites.
Si vous avez un tableau qui contient des objets, vous devez faire une copie de ce tableau, sans toucher à son pointeur interne, et vous avez besoin de tous les objets à être cloné (de sorte que vous n'êtes pas modifier l'original lorsque vous apportez des modifications à la copie d'un tableau), l'utilisation de ce.
L'astuce pour ne pas toucher le tableau de pointeur interne est de s'assurer que vous travaillez avec une copie de la matrice, et non pas le tableau d'origine (ou une référence), donc à l'aide d'un paramètre de fonction le travail sera fait (donc, c'est une fonction qui prend un tableau).
Noter que vous aurez besoin de mettre en œuvre __clone() sur vos objets si vous souhaitez leurs propriétés aussi être cloné.
Cette fonction fonctionne pour n'importe quel type de tableau (y compris le type mixte).
__clone()
fonction de vos objets. Voir le documentation PHP sur le clonage pour plus d'informations sur que. La grande raison pourquoi monarray_clone
fonction ne pas le faire pour vous est l'une des raisons de PHP n'est pas fait pour vous: car il n'est pas efficace, réalisable moyen de se protéger contre les références circulaires.__clone()
fonction (car seul le développeur sait ce qui doit être cloné). SiA
magasinsB
, vous avez besoin pour mettre en œuvre les__clone()
fonctionA
. Et à l'intérieur deA
's__clone()
fonction, vous devez vous assurer que vous cloneB
. Voici un exemple qui montre comment et pourquoi: sandbox.onlinephpfunctions.com/code/...C
à l'intérieur deB
, objetD
à l'intérieur deC
, etc. Cela signifie que je dois mettre en œuvre__clone()
pour tous les objets stockés surABC
niveau. En outre, puisque ces objets sont des classes de fournisseur, j'ai à redéfinir l'ensemble et de l'instancier avec cette extension de classes pour mettre en œuvre correcte clone de comportement. C'est pratiquement impossible dans la vraie application.ReflectionClass
pour obtenir toutes les propriétés de chaque objet et de les cloner comme bien. Je ne vais pas vous empêcher de faire, mais je suis d'attention qu'il n'y est probablement la meilleure façon de résoudre votre problème si vous êtes d'avoir à dupliquer des objets que profonde. Sans le savoir beaucoup au sujet de votre situation, peut-être un conteneur d'injection de dépendance aurait quelque chose à voir. Simplement vous donner quelques idées pour fonctionner avec.__FUNCTION__
est génial.__FUNCTION__
lorsqu'utilisé dans une fonction anonyme. Je vais mettre à jour ma réponse juste normal d'utilisation de la récursivité.__FUNCTION__
dans une variable sur la première ligne dearray_clone
, de sorte que vous n'avez pas à vous rappeler de mettre à jour le nom de la fonction à deux endroits si vous avez l'intention de le mettre quelque part plus longue durée de vie. Voir mes modifications pour un exemple de comment vous pouvez faire cela.Lorsque vous ne
PHP copie le tableau, donc je ne suis pas sûr de savoir comment vous avez obtenu brûlé. Pour votre cas,
devrait fonctionner correctement.
Afin de vous brûler, je pense que vous seriez soit ont été à l'aide de références ou d'attendre les objets à l'intérieur de l'tableaux afin d'être cloné.
array_merge()
est une fonction dans laquelle vous pouvez copier un tableau à l'autre en PHP.$a_c = array_combine(array_keys($a), array_values($a))
.simple et rend la copie en profondeur la rupture de tous les liens
J'aime
array_replace
(ouarray_replace_recursive
).$cloned = array_replace([], $YOUR_ARRAY);
Il fonctionne comme
de l'Objet.attribuer
à partir de JavaScript.entraînera
array_slice($arr, 0)
ou lorsque vous n'avez pas de soins sur les touches,array_values($arr)
? Je suis en train de penser qu'ils pourraient être plus rapide que la recherche dans un tableau. Aussi, en javascript, il est très populaire pour l'utilisationArray.slice()
de cloner des tableaux.array_slice
et toutes les autres méthodes mentionnées ici, le travail très bien. Mais si vous souhaitez fusionner plusieurs clé-valeur-paires (comme c'est également possible avec JS-Objets viaObject.assign
ou le propagation de syntaxe),array_replace
peut être plus utile.array_values()
qui a parfaitement fonctionné pour mon cas d'utilisation.Si vous avez seulement des types de base dans votre tableau, vous pouvez le faire:
Vous n'aurez pas besoin de mettre à jour manuellement les références
Je sais que ça ne marchera pas pour tout le monde, mais il a travaillé pour moi
Puisque ce n'était pas dans les réponses, et est maintenant disponible en PHP 5.3 (supposé Post Original a l'aide d'5.2).
Afin de maintenir une structure de tableau et changer ses valeurs, je préfère utiliser
array_replace
ouarray_replace_recursive
en fonction de mon cas d'utilisation.http://php.net/manual/en/function.array-replace.php
Voici un exemple d'utilisation de
array_replace
etarray_replace_recursive
démontrant qu'il soit en mesure de maintenir l'ordre indexé et capables de suppression d'une référence.http://ideone.com/SzlBUZ
Le code ci-dessous est écrit en utilisant le court syntaxe de tableau est disponible depuis PHP 5.4 qui remplace
array()
avec[]
.http://php.net/manual/en/language.types.array.php
Fonctionne sur offset indexées et le nom des tableaux indexés
De sortie:
Je sais ce que il ya longtemps, mais cela a fonctionné pour moi..
C'est la façon dont je suis la copie de mes tableaux en Php:
Ce sorties:
$test2 = $test;
? Ce problème estArrayObject
de problèmes ici?Définir ce:
Copie $_ARRAY à $_ARRAY2 :
Le plus sûr et le moins cher que j'ai trouvé est:
Cela a aussi l'avantage de réindexer le tableau.
Cela ne fonctionnera pas comme prévu sur le tableau associatif (hash), mais pas plus de réponse précédente.
En tableau php, vous avez besoin simplement de les affecter à d'autres variables pour obtenir une copie de ce tableau. Mais d'abord, vous devez vous assurer que sur ce genre, si c'est un array ou arrayObject ou stdObject.
Pour un Simple tableau php :
$arr_one_copy = array_combine(array_keys($arr_one), $arr_one);
Juste pour poster la solution 😉
Crée une copie de la ArrayObject
de https://www.php.net/manual/en/arrayobject.getarraycopy.php