क्या एक PHP सरणी की प्रतिलिपि दूसरे को बनाने के लिए एक फ़ंक्शन है?
मुझे PHP सरणियों को कॉपी करने की कोशिश में कुछ बार जलाया गया है। मैं किसी वस्तु के अंदर परिभाषित एक सरणी को उसके बाहर वैश्विक रूप से कॉपी करना चाहता हूं।
क्या एक PHP सरणी की प्रतिलिपि दूसरे को बनाने के लिए एक फ़ंक्शन है?
मुझे PHP सरणियों को कॉपी करने की कोशिश में कुछ बार जलाया गया है। मैं किसी वस्तु के अंदर परिभाषित एक सरणी को उसके बाहर वैश्विक रूप से कॉपी करना चाहता हूं।
जवाबों:
PHP सरणियों में प्रतिलिपि द्वारा असाइन किया जाता है, जबकि ऑब्जेक्ट्स संदर्भ द्वारा असाइन किए जाते हैं। इस का मतलब है कि:
$a = array();
$b = $a;
$b['foo'] = 42;
var_dump($a);
निकलेगा:
array(0) {
}
जहाँ तक:
$a = new StdClass();
$b = $a;
$b->foo = 42;
var_dump($a);
पैदावार:
object(stdClass)#1 (1) {
["foo"]=>
int(42)
}
आप इस तरह के रूप में पेचीदगियों से भ्रमित हो सकते हैं ArrayObject
, जो एक ऐसी वस्तु है जो बिल्कुल एक सरणी की तरह कार्य करता है। हालांकि एक वस्तु होने के नाते, इसमें संदर्भ शब्दार्थ है।
संपादित करें: @AndrewLarsson नीचे टिप्पणी में एक बिंदु उठाता है। PHP में एक विशेष सुविधा है जिसे "संदर्भ" कहा जाता है। वे C / C ++ जैसी भाषाओं में कुछ हद तक पॉइंटर्स के समान हैं, लेकिन काफी समान नहीं हैं। यदि आपके सरणी में संदर्भ हैं, तो जबकि सरणी स्वयं प्रतिलिपि द्वारा पारित हो गई है, फिर भी संदर्भ मूल लक्ष्य पर हल होंगे। यह निश्चित रूप से आमतौर पर वांछित व्यवहार है, लेकिन मुझे लगा कि यह ध्यान देने योग्य है।
$copy = $original;
। यदि सरणी तत्व संदर्भ हैं, तो यह काम नहीं करता है।
php
हमें कम से कम अपेक्षित परिणाम के साथ प्रस्तुत करता है , क्योंकि यह समाधान हमेशा काम नहीं करता है । $a=array(); $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
प्रिंट array0
करते समय $a=$GLOBALS; $b=$a; $b["x"]=0; $c=$b; $b["x"]=1; echo gettype($b), $c["x"];
प्रिंट array1
। जाहिरा तौर पर कुछ सरणियों को संदर्भ द्वारा कॉपी किया जाता है।
PHP डिफ़ॉल्ट रूप से एरे को कॉपी करेगी। PHP में सन्दर्भ स्पष्ट होना चाहिए।
$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a
यदि आपके पास एक ऐसा सरणी है जिसमें ऑब्जेक्ट हैं, तो आपको उसके आंतरिक पॉइंटर को स्पर्श किए बिना उस सरणी की एक प्रतिलिपि बनाने की आवश्यकता है, और आपको सभी ऑब्जेक्ट्स को क्लोन करने की आवश्यकता है (ताकि आप कॉपी में परिवर्तन करते समय मूल को संशोधित न कर रहे हों सरणी), इसका उपयोग करें।
सरणी के आंतरिक पॉइंटर को नहीं छूने की चाल यह सुनिश्चित करने के लिए है कि आप सरणी की एक प्रति के साथ काम कर रहे हैं, और मूल सरणी (या इसके लिए एक संदर्भ) नहीं है, इसलिए फ़ंक्शन पैरामीटर का उपयोग करके काम किया जाएगा (इस प्रकार) यह एक ऐसा फंक्शन है जो एक सरणी में होता है)।
ध्यान दें कि आपको अपनी वस्तुओं पर __clone () लागू करने की आवश्यकता होगी, यदि आप चाहते हैं कि उनके गुणों को भी क्लोन किया जाए।
यह फ़ंक्शन किसी भी प्रकार के सरणी (मिश्रित प्रकार सहित) के लिए काम करता है।
function array_clone($array) {
return array_map(function($element) {
return ((is_array($element))
? array_clone($element)
: ((is_object($element))
? clone $element
: $element
)
);
}, $array);
}
__FUNCTION__
शानदार है।
जब तुम करोगे
$array_x = $array_y;
PHP सरणी को कॉपी करता है, इसलिए मुझे यकीन नहीं है कि आपने कैसे जला दिया होगा। आपके मामले के लिए,
global $foo;
$foo = $obj->bar;
ठीक काम करना चाहिए।
जलने के क्रम में, मुझे लगता है कि आपको या तो संदर्भों का उपयोग करना होगा या सरणियों के अंदर वस्तुओं का क्लोन बनाना होगा।
array_merge()
एक ऐसा कार्य है जिसमें आप PHP में एक सरणी को दूसरे में कॉपी कर सकते हैं।
$a_c = array_combine(array_keys($a), array_values($a))
:।
सरल और गहरी प्रतिलिपि बनाता है सभी लिंक को तोड़ने
$new=unserialize(serialize($old));
मुझे पसंद है array_replace
(या array_replace_recursive
)।
$cloned = array_replace([], $YOUR_ARRAY);
यह Object.assign
जावास्क्रिप्ट से काम करता है ।
$original = [ 'foo' => 'bar', 'fiz' => 'baz' ];
$cloned = array_replace([], $original);
$clonedWithReassignment = array_replace([], $original, ['foo' => 'changed']);
$clonedWithNewValues = array_replace([], $original, ['add' => 'new']);
$original['new'] = 'val';
में परिणाम होगा
// 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)
है या आप कुंजियों के बारे में परवाह नहीं है जब, array_values($arr)
? मुझे लगता है कि वे एक सरणी में खोज करने से तेज हो सकते हैं। इसके अलावा, जावास्क्रिप्ट में, यह Array.slice()
क्लोन सरणियों का उपयोग करने के लिए काफी लोकप्रिय है ।
array_slice
Object.assign
array_replace
array_values()
जिसने मेरे उपयोग-मामले के लिए पूरी तरह से काम किया।
यदि आपके पास आपके सरणी में केवल मूल प्रकार हैं, तो आप ऐसा कर सकते हैं:
$copy = json_decode( json_encode($array), true);
आपको मैन्युअल रूप से उन संदर्भों को अपडेट करने की आवश्यकता नहीं होगी जिन्हें
मैं जानता हूं कि यह सभी के लिए काम नहीं करेगा, लेकिन यह मेरे लिए काम करता है
चूंकि यह किसी भी उत्तर में शामिल नहीं था और अब PHP 5.3 में उपलब्ध है (माना जाता है कि मूल पोस्ट 5.2 का उपयोग कर रहा था)।
एक सरणी संरचना को बनाए रखने और इसके मूल्यों को बदलने के लिए मैं अपने उपयोग के मामले के आधार पर array_replace
या उपयोग करना पसंद array_replace_recursive
करता हूं।
http://php.net/manual/en/function.array-replace.php
यहाँ एक उदाहरण का उपयोग किया गया है array_replace
और array_replace_recursive
यह प्रदर्शित किया जा रहा है कि अनुक्रमित क्रम को बनाए रखने और एक संदर्भ को हटाने में सक्षम है।
नीचे दिए गए कोड को PHP 5.4 के बाद से उपलब्ध लघु सरणी सिंटैक्स का उपयोग करके लिखा गया है जो इसके array()
साथ बदलता है []
।
http://php.net/manual/en/language.types.array.php
अनुक्रमित ऑफसेट और नाम अनुक्रमित सरणियों पर या तो काम करता है
$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);
आउटपुट:
["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"
}
मैं इसे बहुत पहले से जानता हूं, लेकिन इसने मेरे लिए काम किया।
$copied_array = array_slice($original_array,0,count($original_array));
यह तरीका है मैं Php में अपने सरणियों की नकल कर रहा हूँ:
function equal_array($arr){
$ArrayObject = new ArrayObject($arr);
return $ArrayObject->getArrayCopy();
}
$test = array("aa","bb",3);
$test2 = equal_array($test);
print_r($test2);
यह आउटपुट:
Array
(
[0] => aa
[1] => bb
[2] => 3
)
$test2 = $test;
? यहाँ क्या समस्या ArrayObject
हल हो रही है?
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);
?>
से https://www.php.net/manual/en/arrayobject.getarraycopy.php
इसे परिभाषित करें:
$copy = create_function('$a', 'return $a;');
$ _ARRAY को $ _ARRAY2 में कॉपी करें:
$_ARRAY2 = array_map($copy, $_ARRAY);
Php सरणी में, आपको उस सरणी की प्रतिलिपि प्राप्त करने के लिए बस उन्हें अन्य चर को असाइन करने की आवश्यकता है। लेकिन पहले आपको यह सुनिश्चित करने की आवश्यकता है कि यह टाइप है या नहीं, यह सरणी है या arrayObject या stdObject।
साधारण php सरणी के लिए:
$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;
}
}
foreach($a as $key => $val) $b[$key] = $val ;
कुंजी और मान दोनों को संरक्षित करता है। सरणी 'a' सरणी 'b' की एक सटीक प्रति है