PHP dizisinin bir kopyasını diğerine kopyalamanın bir işlevi var mı?
PHP dizilerini kopyalamaya çalışırken birkaç kez yandım. Bir nesnenin içinde tanımlanan bir diziyi onun dışında bir global kopyalamak istiyorum.
PHP dizisinin bir kopyasını diğerine kopyalamanın bir işlevi var mı?
PHP dizilerini kopyalamaya çalışırken birkaç kez yandım. Bir nesnenin içinde tanımlanan bir diziyi onun dışında bir global kopyalamak istiyorum.
Yanıtlar:
PHP dizilerinde kopya ile, nesneler referansla atanır. Bunun anlamı şudur ki:
$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);
Verim olacak:
array(0) {
}
Buna karşılık:
$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);
Verim:
object(stdClass)#1 (1) {
["foo"]=>
int(42)
}
ArrayObject
Tam olarak bir dizi gibi davranan bir nesne gibi karmaşıklıklardan kafanız karışabilir . Ancak bir nesne olarak referans semantiği vardır.
Düzenleme: @AndrewLarsson aşağıdaki yorumlarda bir noktaya değiniyor. PHP'nin "referanslar" adı verilen özel bir özelliği vardır. C / C ++ gibi dillerdeki göstergelere biraz benziyorlar, ama aynı değiller. Diziniz referans içeriyorsa, dizinin kendisi kopya yoluyla geçirilirken, başvurular yine de orijinal hedefe çözümlenir. Tabii ki genellikle istenen davranış, ama bahsetmeye değer olduğunu düşündüm.
$copy = $original;
. Dizi öğeleri başvuru ise hangisi işe yaramaz.
php
bize en az beklenen sonucu veriyor , çünkü bu çözüm her zaman işe yaramıyor . $a=array(); $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
baskılar array0
ise $a=$GLOBALS; $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
baskılar array1
. Görünüşe göre bazı diziler referans olarak kopyalanmıştır.
PHP diziyi varsayılan olarak kopyalar. PHP'deki referanslar açık olmalıdır.
$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a
Nesneler içeren bir diziniz varsa, dahili işaretçisine dokunmadan bu dizinin bir kopyasını oluşturmanız ve tüm nesnelerin klonlanması gerekir (böylece kopyalananlarda değişiklik yaptığınızda orijinalleri değiştirmezsiniz) dizi), bunu kullanın.
Dizinin dahili işaretçisine dokunmamanın hilesi, dizinin bir kopyasıyla çalıştığınızdan emin olmaktır, orijinal diziyle (veya referansla) değil, bu nedenle bir işlev parametresi kullanmak işi bitirir (böylece, bu, bir diziyi alan bir işlevdir).
Özelliklerinin de klonlanmasını istiyorsanız, nesnelerinize __clone () uygulamanız gerektiğini unutmayın .
Bu işlev her tür dizi için çalışır (karışık tip dahil).
function array_clone($array) {
return array_map(function($element) {
return ((is_array($element))
? array_clone($element)
: ((is_object($element))
? clone $element
: $element
)
);
}, $array);
}
__FUNCTION__
mükemmel.
Ne zaman yaparsın
$array_x = $array_y;
PHP dizi kopyalar, bu yüzden nasıl yanmış olurdu emin değilim. Davanız için,
global $foo;
$foo = $obj->bar;
iyi çalışmalı.
Yakılmak için ya referans kullanmanız ya da dizilerin içindeki klonlanmayı beklemeniz gerektiğini düşünürdüm.
array_merge()
PHP'de bir diziyi diğerine kopyalayabileceğiniz bir işlevdir.
$a_c = array_combine(array_keys($a), array_values($a))
.
basit ve tüm bağlantıları koparmak derin kopya yapar
$new=unserialize(serialize($old));
Seviyorum array_replace
(veya array_replace_recursive
).
$cloned = array_replace([], $YOUR_ARRAY);
Object.assign
JavaScript gibi çalışır .
$original = [ 'foo' => 'bar', 'fiz' => 'baz' ];
$cloned = array_replace([], $original);
$clonedWithReassignment = array_replace([], $original, ['foo' => 'changed']);
$clonedWithNewValues = array_replace([], $original, ['add' => 'new']);
$original['new'] = 'val';
sonuçlanacak
// 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)
ya anahtarlar umurunda değilken array_values($arr)
? Ben bir dizide arama daha hızlı olabilir düşünüyorum. Ayrıca, javascript'te, Array.slice()
dizileri klonlamak için oldukça popülerdir .
array_slice
Object.assign
array_replace
array_values()
kullanım durumum için mükemmel çalışan önerisi için teşekkür ederim .
Dizinizde yalnızca temel türler varsa bunu yapabilirsiniz:
$copy = json_decode( json_encode($array), true);
Referansları manuel olarak güncellemenize gerek yok
Biliyorum, herkes için işe yaramayacak, ama benim için çalıştı
Bu, cevapların hiçbirinde ele alınmadığı ve şimdi PHP 5.3'te mevcut olduğu için (Original Post'un 5.2 kullandığı varsayılmıştır).
Bir dizi yapısını korumak ve değerlerini değiştirmek için kullanmayı array_replace
veya kullanım durumuma array_replace_recursive
bağlı olarak kullanmayı tercih ederim .
http://php.net/manual/en/function.array-replace.php
Dizine alınmış sıralamayı koruyabildiğini ve bir referansı kaldırabildiğini gösteren array_replace
ve array_replace_recursive
gösteren bir örnek .
Aşağıdaki kod PHP 5.4 beri hangi cümledeki mevcut kısa dizi sözdizimi kullanılarak yazılır array()
ile []
.
http://php.net/manual/en/language.types.array.php
Ofset dizinli ve ad dizinli dizilerde çalışır
$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);
Çıktı:
["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"
}
Bunu uzun zaman önce biliyorum, ama bu benim için çalıştı.
$copied_array = array_slice($original_array,0,count($original_array));
Bu Php benim diziler kopyalamak yoludur:
function equal_array($arr){
$ArrayObject = new ArrayObject($arr);
return $ArrayObject->getArrayCopy();
}
$test = array("aa","bb",3);
$test2 = equal_array($test);
print_r($test2);
Bu çıktılar:
Array
(
[0] => aa
[1] => bb
[2] => 3
)
$test2 = $test;
? ArrayObject
Burada hangi problem çözülüyor?
ArrayObject öğesinin bir kopyasını oluşturur
<?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);
?>
dan https://www.php.net/manual/en/arrayobject.getarraycopy.php
Bunu tanımlayın:
$copy = create_function('$a', 'return $a;');
$ _ARRAY $ _ARRAY2 klasörüne kopyala:
$_ARRAY2 = array_map($copy, $_ARRAY);
Php dizisinde, bu dizinin kopyasını almak için bunları diğer değişkene atamanız yeterlidir. Ancak önce, dizi veya arrayObject veya stdObject olsun, türünden emin olmanız gerekir.
Basit php dizisi için:
$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;
}
}