69 votes

Comment cloner un tableau d'objets en PHP?

J'ai un tableau d'objets. Je sais que les objets assignés par "référence" et des tableaux par "valeur". Mais quand j'assigne le tableau, chaque élément de la matrice est en faisant référence à l'objet, de sorte que lorsque je modifie un objet dans le tableau des modifications sont répercutées dans l'autre.

Est-il un moyen simple de cloner un tableau, ou dois-je faire une boucle par elle pour cloner chaque objet?

67voto

erani Points 369
$array = array_merge(array(), $myArray);

62voto

BoltClock Points 249668

Références pour le même objet déjà d'avoir copié lorsque vous copiez le tableau. Mais il semble que vous voulez peu profonde copier les objets référencés dans le premier tableau, lorsque vous créez le deuxième tableau, vous obtenez deux tableaux distincts, mais des objets similaires.

La façon la plus intuitive, je peux venir jusqu'à maintenant est une boucle; il y a peut être plus simple et plus élégant solutions:

$new = array();

foreach ($old as $k => $v) {
    $new[$k] = clone $v;
}

26voto

Daniel Teichman Points 293

Vous avez besoin de cloner les objets pour éviter d'avoir des références pour le même objet.

function array_copy($arr) {
    $newArray = array();
    foreach($arr as $key => $value) {
        if(is_array($value)) $newArray[$key] = array_copy($value);
        else if(is_object($value)) $newArray[$key] = clone $value;
        else $newArray[$key] = $value;
    }
    return $newArray;
}

24voto

Comme suggéré par AndreKR, à l'aide de array_map() est la meilleure voie à suivre si vous savez déjà que votre tableau contient des objets:

$clone = array_map(function ($object) { return clone $object; }, $array);

6voto

hakre Points 102271

J'ai opté pour le clone ainsi. Le clonage d'un tableau ne fonctionne pas (vous pourriez envisager de certains arrayaccess mise en œuvre pour le faire pour vous), alors que pour le tableau clone avec array_map:

class foo {
    public $store;
    public function __construct($store) {$this->store=$store;}
}

$f = new foo('moo');
$a = array($f);

$b = array_map(function($o) {return clone $o;}, $a);

$b[0]->store='bar';    
var_dump($a, $b);

Tableau clone avec serialize et unserialize

Si vos objets de soutien de la sérialisation, vous pouvez même trier de profondes peu profondes copier/cloner un tour dans leur état de veille et à l'arrière:

$f = new foo('moo');
$a = array($f);

$b = unserialize(serialize($a));

$b[0]->store='bar';
var_dump($a, $b);

Cependant, qui peut être un peu aventureux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X