Apakah ada fungsi untuk membuat salinan array PHP ke yang lain?
Saya telah dibakar beberapa kali mencoba menyalin array PHP. Saya ingin menyalin array yang didefinisikan di dalam suatu objek ke global di luarnya.
Apakah ada fungsi untuk membuat salinan array PHP ke yang lain?
Saya telah dibakar beberapa kali mencoba menyalin array PHP. Saya ingin menyalin array yang didefinisikan di dalam suatu objek ke global di luarnya.
Jawaban:
Dalam array PHP ditugaskan oleh copy, sedangkan objek ditugaskan oleh referensi. Ini berarti:
$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);
Akan menghasilkan:
array(0) {
}
Sedangkan:
$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);
Hasil:
object(stdClass)#1 (1) {
["foo"]=>
int(42)
}
Anda bisa bingung oleh seluk-beluk seperti ArrayObject
, yang merupakan objek yang bertindak persis seperti sebuah array. Namun, sebagai objek, ia memiliki semantik referensi.
Sunting: @AndrewLarsson memunculkan poin dalam komentar di bawah. PHP memiliki fitur khusus yang disebut "referensi". Mereka agak mirip dengan pointer dalam bahasa seperti C / C ++, tetapi tidak persis sama. Jika array Anda berisi referensi, maka saat array itu sendiri dilewatkan oleh salinan, referensi masih akan menyelesaikan ke target asli. Itu tentu saja biasanya perilaku yang diinginkan, tetapi saya pikir itu layak disebutkan.
$copy = $original;
. Yang tidak berfungsi jika elemen array adalah referensi.
php
kita hasil yang paling tidak diharapkan , karena solusi ini tidak selalu berhasil . $a=array(); $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
mencetak array0
sambil $a=$GLOBALS; $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
mencetak array1
. Rupanya beberapa array disalin dengan referensi.
PHP akan menyalin array secara default. Referensi dalam PHP harus eksplisit.
$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a
Jika Anda memiliki array yang berisi objek, Anda perlu membuat salinan array itu tanpa menyentuh pointer internal, dan Anda membutuhkan semua objek yang akan dikloning (sehingga Anda tidak mengubah aslinya ketika Anda membuat perubahan pada salinan array), gunakan ini.
Trik untuk tidak menyentuh pointer internal array adalah untuk memastikan Anda bekerja dengan salinan array, dan bukan array asli (atau referensi ke array), jadi menggunakan parameter fungsi akan menyelesaikan pekerjaan (dengan demikian, ini adalah fungsi yang mengambil array).
Perhatikan bahwa Anda masih perlu menerapkan __clone () pada objek Anda jika Anda ingin properti mereka juga dikloning.
Fungsi ini berfungsi untuk semua jenis array (termasuk tipe campuran).
function array_clone($array) {
return array_map(function($element) {
return ((is_array($element))
? array_clone($element)
: ((is_object($element))
? clone $element
: $element
)
);
}, $array);
}
__FUNCTION__
ini brilian.
Saat kamu melakukan
$array_x = $array_y;
PHP menyalin array, jadi saya tidak yakin bagaimana Anda akan terbakar. Untuk kasus Anda,
global $foo;
$foo = $obj->bar;
harus bekerja dengan baik.
Agar terbakar, saya pikir Anda harus menggunakan referensi atau mengharapkan objek di dalam array yang akan dikloning.
array_merge()
adalah fungsi di mana Anda dapat menyalin satu array ke yang lain di PHP.
$a_c = array_combine(array_keys($a), array_values($a))
.
sederhana dan membuat salinan dalam memecah semua tautan
$new=unserialize(serialize($old));
Saya suka array_replace
(atau array_replace_recursive
).
$cloned = array_replace([], $YOUR_ARRAY);
Ini berfungsi seperti Object.assign
dari 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';
akan menghasilkan
// 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)
atau ketika Anda tidak peduli dengan kunci array_values($arr)
,? Saya pikir mereka mungkin lebih cepat daripada mencari dalam array. Juga, dalam javascript, ini cukup populer untuk digunakan Array.slice()
untuk mengkloning array.
array_slice
dan semua metode lain yang disebutkan di sini berfungsi dengan sangat baik. Tetapi jika Anda ingin menggabungkan beberapa pasangan kunci-nilai (karena dimungkinkan juga dengan JS-Objects via Object.assign
atau spread-syntax ), array_replace
bisa lebih bermanfaat.
array_values()
yang bekerja sempurna untuk kasus penggunaan saya.
Jika Anda hanya memiliki tipe dasar dalam array, Anda dapat melakukan ini:
$copy = json_decode( json_encode($array), true);
Anda tidak perlu memperbarui referensi secara manual.
Saya tahu itu tidak akan berhasil untuk semua orang, tetapi itu berhasil untuk saya
Karena ini tidak tercakup dalam salah satu jawaban dan sekarang tersedia di PHP 5.3 (diasumsikan Original Post menggunakan 5.2).
Untuk mempertahankan struktur array dan mengubah nilainya saya lebih suka menggunakan array_replace
atau array_replace_recursive
tergantung pada kasus penggunaan saya.
http://php.net/manual/en/function.array-replace.php
Berikut adalah contoh menggunakan array_replace
dan array_replace_recursive
menunjukkannya mampu mempertahankan urutan yang diindeks dan mampu menghapus referensi.
Kode di bawah ini ditulis menggunakan sintaks array pendek tersedia sejak PHP 5.4 yang menggantikan array()
dengan []
.
http://php.net/manual/en/language.types.array.php
Berfungsi pada offset array yang diindeks dan nama yang diindeks
$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);
Keluaran:
["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"
}
Saya tahu ini sejak lama, tetapi ini berhasil untuk saya ..
$copied_array = array_slice($original_array,0,count($original_array));
Ini adalah cara saya menyalin array saya di Php:
function equal_array($arr){
$ArrayObject = new ArrayObject($arr);
return $ArrayObject->getArrayCopy();
}
$test = array("aa","bb",3);
$test2 = equal_array($test);
print_r($test2);
Output ini:
Array
(
[0] => aa
[1] => bb
[2] => 3
)
$test2 = $test;
? Masalah apa yang ArrayObject
dipecahkan di sini?
Membuat salinan 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);
?>
dari https://www.php.net/manual/en/arrayobject.getarraycopy.php
Definisikan ini:
$copy = create_function('$a', 'return $a;');
Salin $ _ARRAY ke $ _ARRAY2:
$_ARRAY2 = array_map($copy, $_ARRAY);
Dalam array php, Anda hanya perlu menetapkannya ke variabel lain untuk mendapatkan salinan array itu. Tetapi pertama-tama Anda harus memastikan tentang jenisnya, apakah itu array atau arrayObject atau stdObject.
Untuk array php Sederhana:
$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;
}
}