Gibt es eine Funktion zum Erstellen einer Kopie eines PHP-Arrays in ein anderes?
Ich wurde einige Male beim Versuch, PHP-Arrays zu kopieren, verbrannt. Ich möchte ein innerhalb eines Objekts definiertes Array in ein globales außerhalb kopieren.
Gibt es eine Funktion zum Erstellen einer Kopie eines PHP-Arrays in ein anderes?
Ich wurde einige Male beim Versuch, PHP-Arrays zu kopieren, verbrannt. Ich möchte ein innerhalb eines Objekts definiertes Array in ein globales außerhalb kopieren.
Antworten:
In PHP werden Arrays durch Kopieren zugewiesen, während Objekte durch Referenz zugewiesen werden. Das bedeutet, dass:
$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);
Wird ergeben:
array(0) {
}
Wohingegen:
$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);
Ausbeuten:
object(stdClass)#1 (1) {
["foo"]=>
int(42)
}
Sie könnten durch Feinheiten wie verwirrt werden ArrayObject
ein Objekt, das sich genau wie ein Array verhält. Als Objekt hat es jedoch eine Referenzsemantik.
Bearbeiten: @AndrewLarsson wirft einen Punkt in den Kommentaren unten auf. PHP hat eine spezielle Funktion namens "Referenzen". Sie ähneln Zeigern in Sprachen wie C / C ++, sind aber nicht ganz gleich. Wenn Ihr Array Referenzen enthält, werden die Referenzen weiterhin an das ursprüngliche Ziel aufgelöst, während das Array selbst kopiert wird. Das ist natürlich normalerweise das gewünschte Verhalten, aber ich fand es erwähnenswert.
$copy = $original;
. Was nicht funktioniert, wenn die Array-Elemente Referenzen sind.
php
präsentiert uns das am wenigsten erwartete Ergebnis , da diese Lösung nicht immer funktioniert . $a=array(); $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
druckt array0
während $a=$GLOBALS; $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
druckt array1
. Anscheinend werden einige Arrays als Referenz kopiert.
PHP kopiert das Array standardmäßig. 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
Wenn Sie ein Array haben, das Objekte enthält, müssen Sie eine Kopie dieses Arrays erstellen, ohne den internen Zeiger zu berühren, und Sie müssen alle Objekte klonen (damit Sie die Originale nicht ändern, wenn Sie Änderungen am kopierten Objekt vornehmen Array), benutze dies.
Der Trick, 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). Wenn Sie also einen Funktionsparameter verwenden, wird die Aufgabe erledigt (also Dies ist eine Funktion, die ein Array aufnimmt.
Beachten Sie, dass Sie __clone () weiterhin für Ihre Objekte implementieren müssen, wenn deren Eigenschaften auch geklont werden sollen.
Diese Funktion funktioniert für jeden Array-Typ (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);
}
__FUNCTION__
ist brillant.
Wenn Sie das tun
$array_x = $array_y;
PHP kopiert das Array, daher bin ich mir nicht sicher, wie Sie sich verbrannt hätten. Für Ihren Fall
global $foo;
$foo = $obj->bar;
sollte gut funktionieren.
Um verbrannt zu werden, müssten Sie entweder Referenzen verwendet haben oder erwarten, dass Objekte in den Arrays geklont werden.
array_merge()
ist eine Funktion, mit der Sie ein Array in PHP in ein anderes kopieren können.
$a_c = array_combine(array_keys($a), array_values($a))
.
einfach und macht tiefe Kopie alle Links zu brechen
$new=unserialize(serialize($old));
Ich mag array_replace
(oder array_replace_recursive
).
$cloned = array_replace([], $YOUR_ARRAY);
Es funktioniert wie mit Object.assign
JavaScript.
$original = [ 'foo' => 'bar', 'fiz' => 'baz' ];
$cloned = array_replace([], $original);
$clonedWithReassignment = array_replace([], $original, ['foo' => 'changed']);
$clonedWithNewValues = array_replace([], $original, ['add' => 'new']);
$original['new'] = 'val';
wird darin enden, dass
// original:
{"foo":"bar","fiz":"baz","new":"val"}
// cloned:
{"foo":"bar","fiz":"baz"}
// cloned with reassignment:
{"foo":"changed","fiz":"baz"}
// cloned with new values:
{"foo":"bar","fiz":"baz","add":"new"}
array_slice($arr, 0)
oder wenn Sie sich nicht für Schlüssel interessieren array_values($arr)
? Ich denke, sie sind möglicherweise schneller als die Suche in einem Array. In Javascript ist es auch sehr beliebt, Array.slice()
Arrays zu klonen.
array_slice
funktionieren alle anderen hier genannten Methoden sehr gut. Wenn Sie jedoch mehrere Schlüssel-Wert-Paare zusammenführen möchten (wie dies auch bei JS-Objekten über Object.assign
oder über die Spread-Syntax möglich ist ), array_replace
kann dies nützlicher sein.
array_values()
perfekt für meinen Anwendungsfall funktioniert hat.
Wenn Ihr Array nur grundlegende Typen enthält, können Sie dies tun:
$copy = json_decode( json_encode($array), true);
Sie müssen die Referenzen nicht manuell aktualisieren.
Ich weiß, dass es nicht für alle funktioniert, aber es hat für mich funktioniert
Da dies in keiner der Antworten behandelt wurde und jetzt in PHP 5.3 verfügbar ist (vorausgesetzt, Original Post verwendete 5.2).
Um eine Array-Struktur beizubehalten und ihre Werte zu ändern, bevorzuge ich die Verwendung array_replace
oder array_replace_recursive
abhängig von meinem Anwendungsfall.
http://php.net/manual/en/function.array-replace.php
Hier ist ein Beispiel, in dem verwendet array_replace
und array_replace_recursive
demonstriert wird, dass die indizierte Reihenfolge beibehalten und eine Referenz entfernt werden kann.
Der folgende Code geschrieben wird mit der kurzen Array - Syntax verfügbar seit PHP 5.4 die an der Stelle array()
mit []
.
http://php.net/manual/en/language.types.array.php
Funktioniert mit Offset-indizierten und namenindizierten Arrays
$o1 = new stdClass;
$a = 'd';
//This is the base array or the initial structure
$o1->ar1 = ['a', 'b', ['ca', 'cb']];
$o1->ar1[3] = & $a; //set 3rd offset to reference $a
//direct copy (not passed by reference)
$o1->ar2 = $o1->ar1; //alternatively array_replace($o1->ar1, []);
$o1->ar1[0] = 'z'; //set offset 0 of ar1 = z do not change ar2
$o1->ar1[3] = 'e'; //$a = e (changes value of 3rd offset to e in ar1 and ar2)
//copy and remove reference to 3rd offset of ar1 and change 2nd offset to a new array
$o1->ar3 = array_replace($o1->ar1, [2 => ['aa'], 3 => 'd']);
//maintain original array of the 2nd offset in ar1 and change the value at offset 0
//also remove reference of the 2nd offset
//note: offset 3 and 2 are transposed
$o1->ar4 = array_replace_recursive($o1->ar1, [3 => 'f', 2 => ['bb']]);
var_dump($o1);
Ausgabe:
["ar1"]=>
array(4) {
[0]=>
string(1) "z"
[1]=>
string(1) "b"
[2]=>
array(2) {
[0]=>
string(2) "ca"
[1]=>
string(2) "cb"
}
[3]=>
&string(1) "e"
}
["ar2"]=>
array(4) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
array(2) {
[0]=>
string(2) "ca"
[1]=>
string(2) "cb"
}
[3]=>
&string(1) "e"
}
["ar3"]=>
array(4) {
[0]=>
string(1) "z"
[1]=>
string(1) "b"
[2]=>
array(1) {
[0]=>
string(2) "aa"
}
[3]=>
string(1) "d"
}
["ar4"]=>
array(4) {
[0]=>
string(1) "z"
[1]=>
string(1) "b"
[2]=>
array(2) {
[0]=>
string(2) "bb"
[1]=>
string(2) "cb"
}
[3]=>
string(1) "f"
}
Ich weiß das schon vor langer Zeit, aber das hat bei mir funktioniert.
$copied_array = array_slice($original_array,0,count($original_array));
So kopiere ich meine Arrays in Php:
function equal_array($arr){
$ArrayObject = new ArrayObject($arr);
return $ArrayObject->getArrayCopy();
}
$test = array("aa","bb",3);
$test2 = equal_array($test);
print_r($test2);
Dies gibt aus:
Array
(
[0] => aa
[1] => bb
[2] => 3
)
$test2 = $test;
? Welches Problem ArrayObject
löst sich hier?
Erstellt eine Kopie des ArrayObject
<?php
// Array of available fruits
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);
$fruitsArrayObject = new ArrayObject($fruits);
$fruitsArrayObject['pears'] = 4;
// create a copy of the array
$copy = $fruitsArrayObject->getArrayCopy();
print_r($copy);
?>
von https://www.php.net/manual/en/arrayobject.getarraycopy.php
Definieren Sie dies:
$copy = create_function('$a', 'return $a;');
Kopieren Sie $ _ARRAY nach $ _ARRAY2:
$_ARRAY2 = array_map($copy, $_ARRAY);
Im PHP-Array müssen Sie sie nur einer anderen Variablen zuweisen, um eine Kopie dieses Arrays zu erhalten. Aber zuerst müssen Sie sicherstellen, dass es sich um einen Typ handelt, ob es sich um Array oder ArrayObject oder StdObject handelt.
Für einfaches PHP-Array:
$a = array(
'data' => 10
);
$b = $a;
var_dump($b);
output:
array:1 [
"data" => 10
]
private function cloneObject($mixed)
{
switch (true) {
case is_object($mixed):
return clone $mixed;
case is_array($mixed):
return array_map(array($this, __FUNCTION__), $mixed);
default:
return $mixed;
}
}