Copier un tableau associatif

Ce matin je suis tombé sur un tweet de Julien Pauli présentant une syntaxe pour « copier rapidement un tableau associatif ». D'abord intrigué par une syntaxe que je n'avais jamais vu auparavant, je suis vite revenu à mes esprits devant ce qui était finalement beaucoup de complication pour rien.

407

Julien voulait montrer que PHP pouvait modifier un tableau directement depuis la construction foreach, malheureusement le « Short copy of an array » c'est révélé des plus trompeur. Craignant que des bébés devs ne pensent que c'est effectivement de cette façon que l'on copie un tableau associatif, je vous propose un petit billet sur ce fondamental qui nous permettra de découvrir la différence entre l'assignation par copie et l'assignation par référence. En bonus nous verrons comment ça se passe pour Javascript. Après tout, je suis là pour sauver l'univers. Alors c'est parti !

L'assignation d'un tableau induit toujours
la copie des valeurs

En PHP l'assignation d'un tableau induit toujours la copie des valeurs, le code $b = $a suffit donc à copier les valeurs de $a dans $b.

Considérons le code suivant :

<?php

$a = array(123);

$b = $a;

$a[] = 4;
$b[] = 5;

var_dump($a$b);

On obtiendra le résultat suivant :

array
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 4

array
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 5

Les valeurs de $a sont bien copiée dans $b mais $a et $b sont deux tableaux distincts avec des valeurs différentes.

Un comportement différent en Javascript

La copie des valeurs lors de l'assignation est particulière à PHP, en Javascript l'assignation se fait par référence, cela signifie que les deux variables pointent vers le même conteneur de donnée, rien n'est copié nul part.

var a = [1, 2, 3];
var b = a;

a.push(4);
b.push(5);

console.log(a, b);

Ici a et b pointent vers le même conteneur de données, les deux push() se font donc sur le même objet :

[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]

On notera que l'assignation par référence est possible en PHP au moyen de la syntaxe « $var = &$othervar; ».

Cloner un tableau en Javascript

Pour copier un tableau en Javascript, ou plutôt le cloner, il suffit d'utiliser la méthode slice() :

var a = [1, 2, 3];
var b = a.slice();

a.push(4);
b.push(5);

console.log(a, b);

La méthode slice() peut être utilisée pour cloner simplement un tableau, le résultat est alors identique à celui de PHP, c'est à dire deux tableaux distincts avec des valeurs différentes :

[1, 2, 3, 4] [1, 2, 3, 5]

Conclusion

Si vous souhaitez en savoir d'avantage sur l'assignation en PHP je vous invite à consulter la documentation sur les opérateurs d'assignation et sur les tableaux.

Laisser un commentaire

Un commentaire

Nakiloe
Nakiloe

Merci pour cet article qui a répondu à mes doutes lors de la copie d'un tableau en php ^^