2010-03-02 22 views
6

Mam 2 tablice.Elementy tablicy dereferencyjnej PHP

$result = array(); 
$row = array(); 

Elementy wiersza to odniesienia i stale się zmieniają. Dla każdej iteracji $row chcę skopiować wartości wiersza do wpisu $result, a nie odniesienia.

Znalazłem kilka rozwiązań, ale wszystkie wydają się okropne.

$result[] = unserialize(serialize($row)); 
$result[] = array_flip(array_flip($row)); 

Oba wyżej pracy, ale wydaje się dużo niepotrzebnej i brzydkiego kodu po prostu skopiować zawartość tablicy odniesienia pod względem wartości, zamiast kopiowania samych referencji.

Czy istnieje lepszy sposób osiągnięcia tego? Jeśli nie, jaki byłby najbardziej efektywny sposób?

Dzięki.

EDIT: Jak sugeruje coś takiego jak poniżej:

function dereference($ref) { 
    $dref = array(); 

    foreach ($ref as $key => $value) { 
     $dref[$key] = $value; 
    } 

    return $dref; 
} 

$result[] = dereference($row); 

działa także, ale wydaje się równie brzydkie.

+0

To może być duplikat, http://stackoverflow.com/questions/1190026/php-copying-array-elements -za-wartość-nie-przez-odniesienie –

+0

Ma do czynienia z przedmiotami. Mam do czynienia wyłącznie z tablicami. – anomareh

+0

Gdyby ludzie przyjęli moją odpowiedź, wierzyli, że mam rację. Jeśli tak nie jest, najprawdopodobniej oznacza to, że na początku nie wyjaśniłeś pytania. Uważam, że jest to dość niegrzeczne, aby powiedzieć ludziom, że próbuję ci pomóc, więc nie będę próbować dalej. – zneak

Odpowiedz

4

Nie jestem pewien, czy całkowicie rozumiem pytanie, ale czy możesz użyć rekursji?

function array_copy($source) { 
    $arr = array(); 

    foreach ($source as $element) { 
     if (is_array($element)) { 
      $arr[] = array_copy($element); 
     } else { 
      $arr[] = $element; 
     } 
    } 

    return $arr; 
} 

$result = array(); 
$row = array(
    array('a', 'b', 'c'), 
    array('d', 'e', 'f') 
); 

$result[] = array_copy($row); 

$row[0][1] = 'x'; 

var_dump($result); 
var_dump($row); 
+0

Wygląda na to, że twoja funkcja rzeczywiście by działała, a to, co sugerowałem, było nieprawidłowe. – anomareh

2

Rozszerzenie funkcji góry jak następuje rozwiązał problem miałem:

function array_copy($source) { 
    $arr = array(); 

    foreach ($source as $element) { 
     if (is_array($element)) { 
      $arr[] = array_copy($element); 
     } elseif (is_object($element)) { 
      // make an object copy 
      $arr[] = clone $element; 
     } else { 
      $arr[] = $element; 
     } 
    } 
    return $arr; 
}