I have 2 arrays.
$result = array();
$row = array();
Row's elements are all references and is constantly changing. For each iteration of $row
I want to copy the values of row into an entry of $result
and not the references.
I have found a few solutions but they all seem rather awful.
$result[] = unserialize(serialize($row));
$result[] = array_flip(array_flip($row));
Both of the above work but seem like a lot of unnecessary and ugly code just to copy the contents of an array of references by value, instead of copying the references themselves.
Is there a cleaner way to accomplish this? If not what would the most efficient way be?
Thanks.
EDIT: As suggested below something such as:
function dereference($ref) {
$dref = array();
foreach ($ref as $key => $value) {
$dref[$key] = $value;
}
return $dref;
}
$result[] = dereference($row);
Also works but seems equally as ugly.
Array Dereferencing is really very good feature added in PHP 5.4. With this you can directly access an array object directly of a method a functions. Now we can say that no more temporary variables in php now.
PHP does not have pointers, but it does have references. The syntax that you're quoting is basically the same as accessing a member from a pointer to a class in C++ (whereas dot notation is used when it isn't a pointer.)
The array_keys() function is used to get all the keys or a subset of the keys of an array. Note: If the optional search_key_value is specified, then only the keys for that value are returned. Otherwise, all the keys from the array are returned.
Not sure I totally understand the question, but can you use recursion?
function array_copy($source) {
$arr = array();
foreach ($source as $element) {
if (is_array($element)) {
$arr[] = array_copy($element);
} else {
$arr[] = $element;
}
}
return $arr;
}
$result = array();
$row = array(
array('a', 'b', 'c'),
array('d', 'e', 'f')
);
$result[] = array_copy($row);
$row[0][1] = 'x';
var_dump($result);
var_dump($row);
Extending the function above like follows solved a problem I had:
function array_copy($source) {
$arr = array();
foreach ($source as $element) {
if (is_array($element)) {
$arr[] = array_copy($element);
} elseif (is_object($element)) {
// make an object copy
$arr[] = clone $element;
} else {
$arr[] = $element;
}
}
return $arr;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With