我有2个阵列。
$result = array();
$row = array();
Row的元素都是引用,并且不断变化。对于$row
的每次迭代,我想将行的值复制到$result
的条目而不是引用。
我找到了一些解决方案,但它们看起来都很糟糕。
$result[] = unserialize(serialize($row));
$result[] = array_flip(array_flip($row));
上述两项工作似乎都是很多不必要和丑陋的代码,只是为了按值复制引用数组的内容,而不是复制引用本身。
有没有更简洁的方法来实现这一目标?如果不是最有效的方式是什么?
感谢。
编辑:如下所示,例如:
function dereference($ref) {
$dref = array();
foreach ($ref as $key => $value) {
$dref[$key] = $value;
}
return $dref;
}
$result[] = dereference($row);
也有效但看起来同样丑陋。
答案 0 :(得分:4)
不确定我完全理解这个问题,但你能使用递归吗?
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);
答案 1 :(得分:2)
如上所述扩展上述功能解决了我遇到的问题:
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;
}
答案 2 :(得分:-1)
$result = array_map(function($_){return $_;}, $row);