小智 58
$array = array_merge(array(), $myArray);
Run Code Online (Sandbox Code Playgroud)
Bol*_*ock 47
复制数组时,已复制对相同对象的引用.但是,当您创建第二个数组时,听起来您想要对第一个数组中引用的对象进行浅层复制,因此您将获得两个不同但相似的对象数组.
我现在能够提出的最直观的方法是循环; 那里可能有更简单或更优雅的解决方案:
$new = array();
foreach ($old as $k => $v) {
$new[$k] = clone $v;
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*man 20
您需要克隆对象以避免引用同一对象.
function array_copy($arr) {
$newArray = array();
foreach($arr as $key => $value) {
if(is_array($value)) $newArray[$key] = array_copy($value);
else if(is_object($value)) $newArray[$key] = clone $value;
else $newArray[$key] = $value;
}
return $newArray;
}
Run Code Online (Sandbox Code Playgroud)
小智 16
正如AndreKR所建议的,如果你已经知道你的数组包含对象,那么使用array_map()是最好的方法:
$clone = array_map(function ($object) { return clone $object; }, $array);
Run Code Online (Sandbox Code Playgroud)
我也选择了克隆.克隆数组不起作用(你可以考虑一些实施了ArrayAccess为你这样做),因此作为阵列克隆与array_map:
class foo {
public $store;
public function __construct($store) {$this->store=$store;}
}
$f = new foo('moo');
$a = array($f);
$b = array_map(function($o) {return clone $o;}, $a);
$b[0]->store='bar';
var_dump($a, $b);
Run Code Online (Sandbox Code Playgroud)
如果您的对象支持序列化,您甚至可以通过浏览其睡眠状态和返回来进行深度浅拷贝/克隆:
$f = new foo('moo');
$a = array($f);
$b = unserialize(serialize($a));
$b[0]->store='bar';
var_dump($a, $b);
Run Code Online (Sandbox Code Playgroud)
然而,这可能有点冒险.