आप तथ्य यह है कि कार्यों dereferences परिणाम जब, लौटने उदाहरण के लिए उपयोग कर सकते हैं यहाँ $array_by_myclone
अभी भी $original
($array_by_myclone[0][0] == 'foo'
) के लिए एक संदर्भ होगा जबकि $array_by_assignment
($array_by_assignment[0][0] == 'bar'
)
$original = 'foo';
$array_of_reference = array(&$original);
function myclone($value)
{
return $value;
}
$array_by_myclone = array();
$array_by_myclone[] = array_map('myclone', $array_of_reference);
$array_by_assignment = array();
$array_by_assignment[] = $array_of_reference;
$original = 'bar';
var_dump($array_by_myclone[0][0]); // foo, values were cloned
var_dump($array_by_assignment[0][0]); // bar, still a reference
संपादित एक क्लोन मूल्य होगा: मैं यह जांचना चाहता था कि unserialize(serialize())
कहने वाली टिप्पणी तेज थी, इसलिए मैंने PHP 5.5 का उपयोग करके परीक्षण किया था, और यह पता चला है कि यह गलत है: serialization विधि का उपयोग करके छोटे डेटासेट के साथ भी धीमा है, और जितना अधिक डेटा आपके पास धीमा है हो जाता है।
[email protected]:~$ php -v
PHP 5.5.1-1~dotdeb.1 (cli) (built: Aug 3 2013 22:19:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
with Zend OPcache v7.0.2-dev, Copyright (c) 1999-2013, by Zend Technologies
[email protected]:~$ php reference.php 1
myclone: 0.000010 seconds
serialize: 0.000012 seconds
[email protected]:~$ php reference.php 1000000
myclone: 0.398540 seconds
serialize: 0.706631 seconds
कोड का प्रयोग किया:
<?php
$iterations = 1000000;
if (isset($argv[1]) && is_numeric($argv[1])) {
$iterations = max(1, (int)$argv[1]);
}
$items = array();
for ($i = 0; $i < $iterations; $i++) {
$items[] = 'item number '.$i;
}
$array_of_refs = array();
foreach ($items as $k => $v) {
$array_of_refs[] = &$items[$k];
}
function myclone($value)
{
return $value;
}
$start = microtime(true);
$copy = array_map('myclone', $array_of_refs);
$time = microtime(true) - $start;
printf("%-10s %2.6f seconds\n", 'myclone:', $time);
$start = microtime(true);
$copy = unserialize(serialize($array_of_refs));
$time = microtime(true) - $start;
printf("%-10s %2.6f seconds\n", 'serialize:', $time);
@leonbloy मैं सहमत हूं। – Chad