647 Stimmen

Gibt es eine Funktion, um eine Kopie eines PHP-Arrays in ein anderes zu erstellen?

Gibt es eine Funktion, um eine Kopie eines PHP-Arrays in ein anderes zu erstellen?

Ich habe ein paar Mal versucht, PHP-Arrays zu kopieren, und bin damit gescheitert. Ich möchte ein Array, das innerhalb eines Objekts definiert ist, in ein globales Array außerhalb des Objekts kopieren.

1095voto

troelskn Punkte 110542

In PHP werden alle Variablen mit Ausnahme von Objekten durch einen Mechanismus namens Copy-on-Write zugewiesen, während Objekte durch Referenzen zugewiesen werden. Das bedeutet, dass für Arrays mit skalaren Werten einfach $b = $a wird Ihnen bereits eine Kopie zukommen lassen:

$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);

Wird nachgeben:

array(0) {
}

Bei Objekten hingegen,

$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);

Ausbeute:

object(stdClass)#1 (1) {
  ["foo"]=>
  int(42)
}

Ein Grenzfall, bei dem Array-Elemente auch Objekte sein können, die geklont werden müssen, wird in eine weitere Antwort

Sie könnten verwirrt werden durch Feinheiten wie ArrayObject ist ein Objekt, das sich genau wie ein Array verhält. Da es sich jedoch um ein Objekt handelt, hat es eine Referenzsemantik.

Bearbeiten: @AndrewLarsson spricht in den Kommentaren unten einen Punkt an. PHP hat eine spezielle Funktion namens "Referenzen". Sie sind etwas ähnlich wie Zeiger in Sprachen wie C/C++, aber nicht ganz dasselbe. Wenn Ihr Array Referenzen enthält, dann werden die Referenzen immer noch auf das ursprüngliche Ziel aufgelöst, während das Array selbst per Kopie übergeben wird. Das ist natürlich normalerweise das gewünschte Verhalten, aber ich dachte, es wäre erwähnenswert.

256voto

slikts Punkte 7650

PHP wird das Array standardmäßig kopieren. Referenzen in PHP müssen explizit sein.

$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a

58voto

Andrew Larsson Punkte 820

Wenn Sie ein Array haben, das Objekte enthält, Sie eine Kopie dieses Arrays erstellen müssen, ohne den internen Zeiger zu berühren, und Sie alle Objekte klonen müssen (damit Sie die Originale nicht ändern, wenn Sie Änderungen am kopierten Array vornehmen), verwenden Sie dies.

Der Trick, um den internen Zeiger des Arrays nicht zu berühren, besteht darin, sicherzustellen, dass Sie mit einer Kopie des Arrays arbeiten und nicht mit dem ursprünglichen Array (oder einem Verweis darauf), so dass die Verwendung eines Funktionsparameters die Aufgabe erfüllt (dies ist also eine Funktion, die ein Array aufnimmt).

Beachten Sie, dass Sie immer noch Folgendes implementieren müssen __klonen() für Ihre Objekte, wenn Sie möchten, dass deren Eigenschaften ebenfalls geklont werden.

Diese Funktion funktioniert für jede Art von Array (einschließlich gemischter Typen).

function array_clone($array) {
    return array_map(function($element) {
        return ((is_array($element))
            ? array_clone($element)
            : ((is_object($element))
                ? clone $element
                : $element
            )
        );
    }, $array);
}

34voto

chaos Punkte 118918

Wenn Sie das tun

$array_x = $array_y;

PHP kopiert das Array, daher bin ich mir nicht sicher, wie Sie sich verbrannt haben könnten. Für Ihren Fall,

global $foo;
$foo = $obj->bar;

sollte gut funktionieren.

Um verbrannt zu werden, würde ich denken, dass Sie entweder Referenzen verwendet haben oder erwarten, dass Objekte innerhalb der Arrays geklont werden.

30voto

Einfach und macht tiefes Kopieren brechen alle Links

$new=unserialize(serialize($old));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X