2010-03-24 3 views
0

Supposons que j'ai un tableau de noeuds (objets). J'ai besoin de créer une copie de ce tableau que je peux modifier sans affecter le tableau source. Mais changer les nœuds affectera les nœuds source. Fondamentalement, maintenir des pointeurs sur les objets au lieu de dupliquer leurs valeurs.Dupliquer un tableau mais maintenir des liens de pointeur

// node(x, y) 
$array[0] = new node(15, 10); 
$array[1] = new node(30, -10); 
$array[2] = new node(-2, 49); 

// Some sort of copy system 
$array2 = $array; 

// Just to show modification to the array doesn't affect the source array 
array_pop($array2); 
if (count($array) == count($array2)) 
    echo "Fail";  

// Changing the node value should affect the source array 
$array2[0]->x = 30; 
if ($array2[0]->x == $array[0]->x) 
    echo "Goal"; 

Quelle serait la meilleure façon de procéder?

+0

Je ne comprends pas. Comment pouvez-vous modifier le tableau sans affecter le tableau source lorsque vous voulez qu'il mette à jour le tableau source lorsque vous modifiez une valeur dans le tableau dupliqué? Pouvez-vous donner un exemple de ce que vous faites avec cela? –

+0

Je pense qu'il veut dire que le tableau dupliqué devrait avoir les références aux mêmes instances que le premier tableau, mais être lui-même indépendant du tableau. Ainsi, changer le contenu du second tableau ne modifiera pas le premier tableau, mais changer un paramètre dans une classe référencée par le second tableau modifiera la même instance qui est refermée par le premier tableau. – Kjir

+0

@Kjir: Ahhh, je vois que cela a du sens maintenant :) –

Répondre

2

Si vous utilisez PHP 5:

Avez-vous exécuter votre code? Cela fonctionne déjà, pas besoin de changer quoi que ce soit. je reçois:

Goal 

quand je le lance.

Probablement parce que les valeurs de $array sont déjà des références.

Lire également this question. Bien que OP ait voulu réaliser le contraire, il pourrait être utile de comprendre comment la copie de tableau fonctionne en PHP.

Mise à jour:

Ce comportement, lors de la copie des tableaux avec des objets, la référence à l'objet est copié au lieu de l'objet lui-même, was reported as a bug. Mais pas de nouvelles informations à ce sujet pour le moment.


Si vous utilisez PHP 4: (Pourquoi utilisez-vous encore)

Vous devez faire quelque chose comme:

$array2 = array(); 

for($i = 0; $i<count($array); $i++) { 
    $array2[$i] = &$array[$i]; 
} 
+0

Ahhh, je n'a pas réellement testé le code.Je m'attendais à devoir utiliser «copier» ou quelque chose comme ça. Merci pour l'info. Comment cela fonctionne-t-il lors du passage des fonctions? –

+0

@StJohn Johnson: Que voulez-vous dire par les fonctions de passage? Un objet passé à une fonction en tant que paramètre? Cela devrait également être passé par référence (en PHP 5). Voir aussi ici: http://devzone.zend.com/article/1714 –

0

il est un certain temps que je ne écris pas de code PHP, mais le code

// Some sort of copy system 
$array2 = $array; 

fonctionnent réellement?

Vous n'avez pas besoin de copier chaque élément de la baie dans un nouveau?

+0

Non, vous n'avez pas besoin de copier tous les éléments. La documentation dit: * L'assignation de tableau implique toujours la copie de valeur. * Http://php.net/manual/fr/language.types.array.php –

+0

vous avez raison ... pendant ma réponse je pensais comment garder des pointeurs au lieu d'une copie des objets ... –

Questions connexes