it-swarm.com.de

Gibt es eine Funktion, um eine Kopie von a zu erstellen? PHP Array zu einem anderen?

Gibt es eine Funktion, um eine Kopie eines PHP - Arrays auf ein anderes zu kopieren?

Ich wurde ein paar Mal gebrannt, als ich versuchte, PHP Arrays zu kopieren. Ich möchte ein in ein Objekt definiertes Array in ein globales Objekt außerhalb kopieren.

461
vfclists

In PHP werden Arrays per Kopie zugewiesen, während Objekte per Referenz zugewiesen werden. Das bedeutet, dass:

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

Wird nachgeben:

array(0) {
}

Wohingegen:

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

Erträge:

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

Sie könnten verwirrt sein mit Feinheiten wie ArrayObject , einem Objekt, das sich genau wie ein Array verhält. Als Objekt hat es jedoch Referenzsemantik.

Bearbeiten: @AndrewLarsson wirft einen Punkt in den folgenden Kommentaren ein. PHP hat eine spezielle Funktion namens "Verweise". Sie ähneln Zeigern in Sprachen wie C/C++, sind jedoch nicht ganz gleich. Wenn Ihr Array Verweise enthält, werden die Verweise, während das Array selbst per Kopie übergeben wird, immer noch zum ursprünglichen Ziel aufgelöst. Das ist natürlich normalerweise das gewünschte Verhalten, aber ich dachte, es sei erwähnenswert.

836
troelskn

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
165
slikts

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

Wenn Sie den internen Zeiger des Arrays nicht berühren, stellen Sie sicher, dass Sie mit einer Kopie des Arrays und nicht mit dem ursprünglichen Array (oder einem Verweis darauf) arbeiten. Wenn Sie also einen Funktionsparameter verwenden, wird die Arbeit erledigt ( Dies ist eine Funktion, die ein Array übernimmt.

Beachten Sie, dass Sie weiterhin __clone () für Ihre Objekte implementieren müssen, wenn deren Eigenschaften ebenfalls geklont werden sollen.

Diese Funktion funktioniert für alle Arten von Arrays (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);
}
39
Andrew Larsson

Wenn Sie das tun

$array_x = $array_y;

PHP kopiert das Array, daher bin ich mir nicht sicher, wie Sie verbrannt werden würden. Für Ihren Fall

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

sollte gut funktionieren.

Um verbrannt zu werden, müssten Sie entweder Referenzen verwenden oder Objekte innerhalb der Arrays erwarten, die geklont werden sollen.

28
chaos

array_merge() ist eine Funktion, in der Sie in PHP ein Array in ein anderes kopieren können.

17
Kshitiz Saxena

einfach und macht tiefe Kopie, die alle Verbindungen bricht

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

Ich mag array_replace (oder array_replace_recursive ).

$cloned = array_replace([], $YOUR_ARRAY);

Es funktioniert wie Object.assign von 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"}
10
Putzi San

Wenn Sie nur Basistypen in Ihrem Array haben, können Sie Folgendes tun:

$copy = json_decode( json_encode($array), true);

Sie müssen die Referenzen nicht manuell aktualisieren
Ich weiß, dass es nicht für jeden funktioniert, aber es hat für mich funktioniert

8
chrmcpn

Da dies in keiner der Antworten enthalten war und jetzt in PHP 5.3 verfügbar ist (unter der Annahme, dass Original Post 5.2 verwendet hat).

Um eine Array-Struktur beizubehalten und ihre Werte zu ändern, benutze ich vorzugsweise array_replace oder array_replace_recursive, abhängig von meinem Anwendungsfall.

http://php.net/manual/de/function.array-replace.php

Hier ist ein Beispiel, in dem array_replace und array_replace_recursive gezeigt werden, dass die indizierte Reihenfolge beibehalten werden kann und eine Referenz entfernt werden kann.

http://ideone.com/SzlBUZ

Der folgende Code wird mit der seit PHP 5.4 verfügbaren kurzen Array-Syntax geschrieben, die array() durch []. http://php.net/manual/de/language.types.array.php ersetzt.

Funktioniert auf versetzten 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"
  }
4
fyrye

Ich weiß das vor langer Zeit, aber das hat für mich funktioniert ..

$copied_array = array_slice($original_array,0,count($original_array));

Auf diese Weise 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
)
2
Baykal

Definiere das:

$copy = create_function('$a', 'return $a;');

Kopieren Sie $ _ARRAY nach $ _ARRAY2:

$_ARRAY2 = array_map($copy, $_ARRAY);
1

Der sicherste und billigste Weg, den ich gefunden habe, ist:

<?php 
$b = array_values($a);

Dies hat auch den Vorteil, das Array neu zu indexieren. 

Dies funktioniert nicht wie erwartet für das assoziative Array (Hash), jedoch nicht die meisten der vorherigen Antworten.

1
Hussard

$arr_one_copy = array_combine(array_keys($arr_one), $arr_one);

Nur um noch eine Lösung zu posten;)

0
Kim
<?php
function arrayCopy( array $array ) {
        $result = array();
        foreach( $array as $key => $val ) {
            if( is_array( $val ) ) {
                $result[$key] = arrayCopy( $val );
            } elseif ( is_object( $val ) ) {
                $result[$key] = clone $val;
            } else {
                $result[$key] = $val;
            }
        }
        return $result;
}
?>
0
umair

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

0
kheengz

Im PHP-Array müssen Sie sie einfach einer anderen Variablen zuweisen, um eine Kopie dieses Arrays zu erhalten. Zuerst müssen Sie jedoch den Typ überprüfen, ob Array oder ArrayObject oder StdObject.

Für einfaches PHP-Array:

$a = array(
'data' => 10
);

$b = $a;

var_dump($b);

output:

array:1 [
  "data" => 10
]
0
MAULIK MODI