অন্য কোনও পিএইচপি অ্যারের অনুলিপি তৈরি করার কোনও ফাংশন আছে?
পিএইচপি অ্যারে অনুলিপি করার চেষ্টা করে আমি কয়েক বার পোড়া হয়েছি। আমি কোনও বস্তুর অভ্যন্তরের সংজ্ঞায়িত অ্যারে এর বাইরে গ্লোবালটিতে অনুলিপি করতে চাই।
অন্য কোনও পিএইচপি অ্যারের অনুলিপি তৈরি করার কোনও ফাংশন আছে?
পিএইচপি অ্যারে অনুলিপি করার চেষ্টা করে আমি কয়েক বার পোড়া হয়েছি। আমি কোনও বস্তুর অভ্যন্তরের সংজ্ঞায়িত অ্যারে এর বাইরে গ্লোবালটিতে অনুলিপি করতে চাই।
উত্তর:
পিএইচপি-তে অ্যারেগুলি অনুলিপি দ্বারা নির্ধারিত হয়, যখন অবজেক্টগুলি রেফারেন্স দ্বারা নির্ধারিত হয়। এই যে মানে:
$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
, এটি এমন একটি বস্তু যা ঠিক অ্যারের মতোই কাজ করে। তবে একটি বস্তু হওয়ার কারণে এটিতে শব্দার্থবিজ্ঞানের উল্লেখ রয়েছে।
সম্পাদনা করুন: @ অ্যান্ড্রুলারসন নীচের মন্তব্যে একটি বক্তব্য উত্থাপন করেছেন। পিএইচপি'র "রেফারেন্স" নামে একটি বিশেষ বৈশিষ্ট্য রয়েছে। এগুলি সি / সি ++ এর মতো ভাষার পয়েন্টারগুলির সাথে কিছুটা মিল তবে একেবারে এক নয়। যদি আপনার অ্যারেতে রেফারেন্স থাকে তবে অ্যারে নিজেই অনুলিপি দ্বারা পাস করার পরে, রেফারেন্সগুলি এখনও মূল টার্গেটে সমাধান করবে। এটি অবশ্যই পছন্দসই আচরণ, তবে আমি মনে করি এটি উল্লেখযোগ্য।
$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
। সম্ভবত কিছু অ্যারে রেফারেন্স দ্বারা অনুলিপি করা হয়।
পিএইচপি ডিফল্টভাবে অ্যারের অনুলিপি করবে। পিএইচপি-তে রেফারেন্সগুলি স্পষ্ট করতে হবে।
$a = array(1,2);
$b = $a; // $b will be a different array
$c = &$a; // $c will be a reference to $a
যদি আপনার কাছে এমন অ্যারে থাকে যাতে অবজেক্ট থাকে, আপনাকে সেই অ্যারের অভ্যন্তরীণ পয়েন্টারটি স্পর্শ না করেই তার অনুলিপি তৈরি করতে হবে এবং আপনার সমস্ত বস্তু ক্লোন করা প্রয়োজন (যাতে আপনি অনুলিপিগুলিতে পরিবর্তনগুলি করার সময় মূলগুলি পরিবর্তন করছেন না অ্যারে), এটি ব্যবহার করুন।
অ্যারের অভ্যন্তরীণ পয়েন্টারটি স্পর্শ না করার কৌশলটি হ'ল আপনি অ্যারের অনুলিপিটি নিয়ে কাজ করছেন তা নিশ্চিত করা, এবং মূল অ্যারে (বা এটির কোনও রেফারেন্স) নয়, সুতরাং একটি ফাংশন প্যারামিটার ব্যবহার করে কাজটি সম্পন্ন হবে (এইভাবে, এটি একটি ফাংশন যা অ্যারে নেয়)।
মনে রাখবেন যে আপনার এখনও প্রয়োগ করতে হবে তাদের সম্পত্তিগুলি ক্লোন করতে চান তবে আপনার অবজেক্টগুলিতে __Cone () ।
এই ফাংশনটি কোনও ধরণের অ্যারে (মিশ্রিত প্রকার সহ) এর জন্য কাজ করে।
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;
পিএইচপি অ্যারে অনুলিপি করে, সুতরাং আপনি কীভাবে জ্বলতে পারতেন তা আমি নিশ্চিত নই। আপনার ক্ষেত্রে,
global $foo;
$foo = $obj->bar;
ভাল কাজ করা উচিত।
পুড়ে যাওয়ার জন্য, আমি মনে করি আপনি হয় রেফারেন্স ব্যবহার করে বা অ্যারের ভিতরে থাকা কোনও জিনিসকে ক্লোন করার আশা করছেন।
array_merge()
এমন একটি ফাংশন যা আপনি পিএইচপি-তে অন্য একটি অ্যারে অনুলিপি করতে পারেন।
$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);
আপনার রেফারেন্সগুলি ম্যানুয়ালি আপডেট করার দরকার নেই
আমি জানি এটি সবার জন্য কার্যকর হবে না তবে এটি আমার পক্ষে কাজ করেছে
যেহেতু এটি কোনও উত্তরের মধ্যে আচ্ছাদিত ছিল না এবং এখন পিএইচপি 5.3 এ উপলব্ধ (ধারণা করা হয়েছে যে আসল পোস্টটি 5.2 ব্যবহার করছে)।
একটি অ্যারের কাঠামো বজায় রাখতে এবং এর মান পরিবর্তন করতে আমি ব্যবহার করতে পছন্দ করি array_replace
বা array_replace_recursive
আমার ব্যবহারের ক্ষেত্রে নির্ভর করে।
http://php.net/manual/en/function.array-replace.php
এটি ব্যবহার array_replace
এবং array_replace_recursive
প্রদর্শনের একটি উদাহরণ যা এটি সূচকযুক্ত আদেশ বজায় রাখতে সক্ষম এবং একটি রেফারেন্স অপসারণ করতে সক্ষম।
নীচের কোডটি পিএইচপি 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));
এইভাবে আমি পিএইচপি তে আমার অ্যারেগুলি অনুলিপি করছি:
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
এখানে কোন সমস্যার সমাধান হচ্ছে ?
অ্যারেঅবজেক্টের একটি অনুলিপি তৈরি করে
<?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 2 এ Copy _ARRAY2 অনুলিপি করুন:
$_ARRAY2 = array_map($copy, $_ARRAY);
পিএইচপি অ্যারেতে, আপনাকে এই অ্যারের অনুলিপি পেতে কেবলমাত্র অন্যান্য ভেরিয়েবলের কাছে তাদের নিয়োগ করতে হবে। তবে প্রথমে আপনাকে এটি টাইপ সম্পর্কে নিশ্চিত করতে হবে, এটি অ্যারে বা অ্যারেঅবজেক্ট বা স্ট্ডবজেক্ট কিনা।
সাধারণ পিএইচপি অ্যারের জন্য:
$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;
}
}