Is er een functie om een ​​kopie van een PHP-array naar de andere te maken?

Is er een functie om een ​​kopie van een PHP-array naar de andere te maken?

Ik ben een paar keer verbrand proberen om PHP-arrays te kopiëren. Ik wil een array kopiëren die is gedefinieerd in een object naar een wereldwijd daarbuiten.


Antwoord 1, Autoriteit 100%

In PHP-arrays worden door kopiëren toegewezen, terwijl objecten worden toegewezen door verwijzing. Dit betekent dat:

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

Willield:

array(0) {
}

overwegende dat:

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

rendementen:

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

U kunt in de war raken door ingewikkeldheid zoals ArrayObject, wat een object is dat precies op een array werkt. Een object zijn, heeft het echter een referentie-semantiek.

EDIT: @Andrewlarsson verhoogt een punt in de onderstaande opmerkingen. PHP heeft een speciale functie genaamd “Referenties”. Ze zijn enigszins vergelijkbaar met aanwijzingen in talen zoals C / C++, maar niet helemaal hetzelfde. Als uw array referenties bevat, terwijl de array zelf wordt aangenomen door exemplaar, zullen de referenties nog steeds oplichten op het oorspronkelijke doel. Dat is natuurlijk meestal het gewenste gedrag, maar ik dacht dat het het vermelden waard was.


Antwoord 2, Autoriteit 22%

PHP kopieert de array standaard. Referenties in PHP moeten expliciet zijn.

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

Antwoord 3, Autoriteit 5%

Als u een array hebt die objecten bevat, moet u een kopie van die array maken zonder de interne aanwijzer aan te raken, en u hebt alle te klonen objecten (zodat u de originelen niet aanpast wanneer u wijzigingen aanbrengt Gebruik dit naar de gekopieerde array).

De truc om de interne aanwijzer van de array niet aan te raken, is ervoor te zorgen dat u werkt met een kopie van de array, en niet de originele array (of een verwijzing naar het), dus het gebruik van een functieparameter krijgt de taak (Dus dit is een functie die een array inneemt).

Merk op dat u nog steeds moet implementeren __Clone () on Uw objecten als u wilt dat hun eigenschappen ook worden gekloond.

Deze functie werkt voor elk type array (inclusief gemengd type).

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

Antwoord 4, Autoriteit 3%

wanneer u

$array_x = $array_y;

PHP kopieert de array, dus ik weet niet zeker hoe u bent gebrand geworden. Voor uw zaak,

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

zou goed moeten werken.

Om te verbranden, zou ik denken dat je ofwel verwijzingen hoeft te gebruiken of voorwerpen in de te kabelden arrays te verwachten.


Antwoord 5, autoriteit 2%

array_merge()is een functie waarin je de ene array naar de andere kunt kopiëren in PHP.


Antwoord 6, autoriteit 2%

eenvoudig en maakt deep copy verbreken van alle links

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

Antwoord 7, autoriteit 2%

Ik hou van array_replace(of array_replace_recursive).

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

Het werkt als Object.assignvan 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';

zal resulteren in

// 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"}

Antwoord 8

Als je alleen basistypen in je array hebt, kun je dit doen:

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

U hoeft de referenties niet handmatig bij te werken
Ik weet dat het niet voor iedereen werkt, maar het werkte voor mij


Antwoord 9

Ik weet dit zo lang geleden, maar dit werkte voor mij ..

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

Antwoord 10

Aangezien dit niet in een van de antwoorden viel en nu verkrijgbaar is in PHP 5.3 (veronderstelde originele post gebruikte 5.2).

Om een ​​arraystructuur te behouden en de waarden te wijzigen, geef ik het liefst array_replaceof array_replace_recursiveafhankelijk van mijn gebruikscase.

http://php.net/Manual/en/function.array- vervang.php

Hier is een voorbeeld met array_replaceen array_replace_recursiveDemonstreren van het in staat om de geïndexeerde volgorde te behouden en een referentie te verwijderen.

http://ideone.com/szlbuz

De onderstaande code is geschreven met de korte array-syntaxis beschikbaar sinds PHP 5.4 die array()met []vervangt.
http://php.net/manual/en/language.types.array.php

Werkt op Offset geïndexeerde en naam geïndexeerde 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);

Uitvoer:

["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"
  }

Antwoord 11

De veiligste en goedkoopste manier die ik heb gevonden is:

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

Dit heeft ook het voordeel dat de array opnieuw wordt geïndexeerd.

Dit werkt niet zoals verwacht op associatieve array (hash), maar ook niet op de meeste van de vorige antwoorden.


Antwoord 12

Dit is de manier waarop ik mijn arrays kopieer 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);

Dit levert het volgende op:

Array
(
[0] => aa
[1] => bb
[2] => 3
)

Antwoord 13

<?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;
}
?>

Antwoord 14

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

Om nog een oplossing te posten 😉


Antwoord 15

Maakt een kopie van het 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);
?>

van https://www.php.net/manual/en/ arrayobject.getarraycopy.php


Antwoord 16

Definieer dit:

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

Kopieer $_ARRAY naar $_ARRAY2 :

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

Antwoord 17

In php-array moet je ze gewoon aan een andere variabele toewijzen om een kopie van die array te krijgen. Maar eerst moet je zeker weten welk type het is, of het nu array of arrayObject of stdObject is.

Voor een eenvoudige php-array:

$a = array(
'data' => 10
);
$b = $a;
var_dump($b);
output:
array:1 [
  "data" => 10
]

Antwoord 18

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

Antwoord 19

foreach($a as $key => $val) $b[$key] = $val ;

Behoudt zowel de sleutel als de waarden. Array ‘a’ is een exacte kopie van array ‘b’

Other episodes