web-dev-qa-db-fra.com

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

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

J'ai été brûlé plusieurs fois en essayant de copier des tableaux PHP. Je veux copier un tableau défini à l'intérieur d'un objet dans un global extérieur.

461
vfclists

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

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

Rendra:

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 dérouté par des subtilité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 fonctionnalité spéciale appelée "références". Ils ressemblent un peu aux pointeurs de langages tels que C/C++, mais ils ne sont pas tout à fait les mêmes. 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 en cible d'origine. C’est bien sûr le comportement souhaité, mais j’ai pensé que cela méritait d’être mentionné.

836
troelskn

PHP va copier le tableau par défaut. Les références dans 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
165
slikts

Si vous avez un tableau contenant des objets, vous devez en faire une copie sans toucher à son pointeur interne. Tous les objets doivent être clonés (pour que vous ne modifiiez pas les originaux lorsque vous apportez des modifications au fichier copié.). tableau), 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 d'origine (ou une référence à celui-ci), afin d'utiliser un paramètre de fonction pour que le travail soit effectué (ainsi, c'est une fonction qui prend dans un tableau).

Notez que vous devrez toujours implémenter __clone () sur vos objets si vous souhaitez que leurs propriétés soient également clonées.

Cette fonction fonctionne pour tout type de tableau (y compris le type mixte).

function array_clone($array) {
    return array_map(function($element) {
        return ((is_array($element))
            ? array_clone($element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}
39
Andrew Larsson

Quand tu fais

$array_x = $array_y;

PHP copie le tableau, donc je ne sais pas comment vous auriez été brûlé. Pour votre cas,

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

devrait bien fonctionner.

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

28
chaos

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

17
Kshitiz Saxena

simple et rend la copie profonde briser tous les liens

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

Si vous avez uniquement 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 cela ne fonctionnera pas pour tout le monde, mais cela a fonctionné pour moi

8
chrmcpn

Étant donné que cela n’était couvert dans aucune des réponses et est maintenant disponible dans PHP 5.3 (l’origine de la publication originale était de 5.2).

Afin de conserver une structure de tableau et de changer ses valeurs, je préfère utiliser array_replace ou array_replace_recursive en fonction de mon cas d'utilisation.

http://php.net/manual/en/function.array-replace.php

Voici un exemple utilisant array_replace et array_replace_recursive démontrant qu'il est capable de maintenir l'ordre indexé et de supprimer une référence.

http://ideone.com/SzlBUZ

Le code ci-dessous est écrit en utilisant la syntaxe de tableau abrégé disponible depuis PHP 5.4 qui remplace array() par []. http://php.net/manual/fr/language.types.array.php

Fonctionne sur des tableaux indexés offset ou nommés 

$o1 = new stdClass;
$a = 'd';
//This is the base array or the initial structure
$o1->ar1 = ['a', 'b', ['ca', 'cb']];
$o1->ar1[3] = & $a; //set 3rd offset to reference $a

//direct copy (not passed by reference)
$o1->ar2 = $o1->ar1; //alternatively array_replace($o1->ar1, []);
$o1->ar1[0] = 'z'; //set offset 0 of ar1 = z do not change ar2
$o1->ar1[3] = 'e'; //$a = e (changes value of 3rd offset to e in ar1 and ar2)

//copy and remove reference to 3rd offset of ar1 and change 2nd offset to a new array
$o1->ar3 = array_replace($o1->ar1, [2 => ['aa'], 3 => 'd']);

//maintain original array of the 2nd offset in ar1 and change the value at offset 0
//also remove reference of the 2nd offset
//note: offset 3 and 2 are transposed
$o1->ar4 = array_replace_recursive($o1->ar1, [3 => 'f', 2 => ['bb']]);

var_dump($o1);

Sortie:

["ar1"]=>
  array(4) {
    [0]=>
    string(1) "z"
    [1]=>
    string(1) "b"
    [2]=>
    array(2) {
      [0]=>
      string(2) "ca"
      [1]=>
      string(2) "cb"
    }
    [3]=>
    &string(1) "e"
  }
  ["ar2"]=>
  array(4) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    array(2) {
      [0]=>
      string(2) "ca"
      [1]=>
      string(2) "cb"
    }
    [3]=>
    &string(1) "e"
  }
  ["ar3"]=>
  array(4) {
    [0]=>
    string(1) "z"
    [1]=>
    string(1) "b"
    [2]=>
    array(1) {
      [0]=>
      string(2) "aa"
    }
    [3]=>
    string(1) "d"
  }
  ["ar4"]=>
  array(4) {
    [0]=>
    string(1) "z"
    [1]=>
    string(1) "b"
    [2]=>
    array(2) {
      [0]=>
      string(2) "bb"
      [1]=>
      string(2) "cb"
    }
    [3]=>
    string(1) "f"
  }
4
fyrye

Je sais cela il y a longtemps, mais cela a fonctionné pour moi ..

$copied_array = array_slice($original_array,0,count($original_array));
3

Voici comment je copie mes tableaux en Php:

function equal_array($arr){
  $ArrayObject = new ArrayObject($arr);
  return $ArrayObject->getArrayCopy();  
}

$test = array("aa","bb",3);
$test2 = equal_array($test);
print_r($test2);

Cela génère:

Array
(
[0] => aa
[1] => bb
[2] => 3
)
2
Baykal

Définissez ceci:

$copy = create_function('$a', 'return $a;');

Copier $ _ARRAY dans $ _ARRAY2:

$_ARRAY2 = array_map($copy, $_ARRAY);
1
Oscar Gardiazabal

Le moyen le plus sûr et le moins cher que j'ai trouvé est:

<?php 
$b = array_values($a);

Cela a également l'avantage de réindexer le tableau. 

Cela ne fonctionnera pas comme prévu sur un tableau associatif (hachage), mais pas la plupart des réponses précédentes.

1
Hussard
<?php
function arrayCopy( array $array ) {
        $result = array();
        foreach( $array as $key => $val ) {
            if( is_array( $val ) ) {
                $result[$key] = arrayCopy( $val );
            } elseif ( is_object( $val ) ) {
                $result[$key] = clone $val;
            } else {
                $result[$key] = $val;
            }
        }
        return $result;
}
?>
0
umair

Crée une copie de ArrayObject

<?php
// Array of available fruits
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);

$fruitsArrayObject = new ArrayObject($fruits);
$fruitsArrayObject['pears'] = 4;

// create a copy of the array
$copy = $fruitsArrayObject->getArrayCopy();
print_r($copy);

?>

de https://www.php.net/manual/fr/arrayobject.getarraycopy.php

0
kheengz

Dans un tableau php, vous devez simplement les assigner à une autre variable pour obtenir une copie de ce tableau. Mais vous devez d’abord vous assurer de son type, qu’il s’agisse de array, arrayObject ou stdObject.

Pour un tableau php simple:

$a = array(
'data' => 10
);

$b = $a;

var_dump($b);

output:

array:1 [
  "data" => 10
]
0
MAULIK MODI