Dizi yinelenen ama işaretçi bağlantıları korumak

2 Cevap php

Ben düğümler (nesneler) bir dizi var varsayalım. Ben kaynak diziyi etkilemeden değiştirebilirsiniz bu dizinin bir kopyasını oluşturmak gerekir. Ama düğümleri değişen kaynak düğümleri etkileyecektir. Temelde yerine kendi değerlerini çoğaltarak nesnelere işaretçileri sürdürmek.

// 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";

Bu ne için en iyi yol olacağını?

2 Cevap

If you use PHP 5:

Eğer kod çalıştırmak mı? It is already working, no need to change anything. alıyorum:

Goal

Onu çalıştırdığınızda.

Değerleri $array zaten referanslar, çünkü büyük olasılıkla bu.

Ayrıca okumak this question. O OP tersini ulaşmak istedim rağmen, dizi kopyalama PHP nasıl çalıştığını anlamak için yararlı olabilir.

Update:

Nesnelerle diziler kopyalarken Bu davranış, nesneye referans nesne kendisi yerine kopyalandığı, was reported as a bug. Ama bu henüz hiçbir yeni bilgi.


If you use PHP 4:

(Why do you still use it?)

Gibi bir şey yapmak zorunda:

$array2 = array();

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

ben 'yazma PHP kodu don biraz zaman, ama kodu yok

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

gerçekten işe?

Eğer yeni bir dizinin her elemanını kopyalamak zorunda değilsiniz?