2010-03-02 8 views
6

Ich habe 2 Arrays.PHP Dereferenz Array Elemente

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

Zeilenelemente sind alle Referenzen und werden ständig geändert. Für jede Iteration von $row möchte ich die Werte der Zeile in einen Eintrag von $result und nicht die Referenzen kopieren.

Ich habe ein paar Lösungen gefunden, aber sie scheinen alle ziemlich schrecklich.

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

Sowohl die oben genannten Arbeiten scheinen aber wie viele unnötige und hässlich Code einfach den Inhalt eines Arrays der vom Wert zu kopieren, anstatt die Referenzen des Kopierens selbst.

Gibt es einen saubereren Weg, dies zu erreichen? Wenn nicht, was wäre der effizienteste Weg?

Danke.

EDIT: Wie unten etwas vorgeschlagen, wie:

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

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

    return $dref; 
} 

$result[] = dereference($row); 

Auch scheint aber ebenso hässlich funktioniert.

+0

Dies könnte ein Duplikat sein, http://stackoverflow.com/questions/1190026/php-copying-array-elements by-value-not-by-reference –

+0

Er beschäftigt sich mit Objekten. Ich beschäftige mich streng mit Arrays. – anomareh

+0

Wenn Leute meine Antwort auffrischten, dann glaubten sie, dass ich recht hatte. Wenn dies nicht der Fall ist, bedeutet dies höchstwahrscheinlich, dass Sie Ihre Frage zunächst nicht geklärt haben. Ich finde es ziemlich unhöflich an deinem Ende, den Leuten zu sagen, dass ich meinen Versuch, dir zu helfen, ablehnen soll, also werde ich es nicht weiter versuchen. – zneak

Antwort

4

Nicht sicher, ich verstehe die Frage vollständig, aber können Sie Rekursion verwenden?

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

es scheint, als ob Ihre Funktion tatsächlich funktionieren würde und was ich vorgeschlagen habe, war falsch. – anomareh

2

die Funktion oben erweitern wie ein Problem folgt gelöst hatte ich:

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; 
} 
Verwandte Themen