如何从foreach循环中深度复制PHP中的数组?



这是php代码:

$options_schools = array();
$options_schools_deepcopy = array();
if (!empty($schools) && is_array($schools)) {
foreach ($schools as $key => $val) {
$temp_school = $key;
$options_schools[$temp_school]=$key;    
}
$options_schools_deepcopy= $options_schools;
}
echo form_dropdown('school', $options_schools_deepcopy, '');    

我希望数组$options_schools_deepcopy承载数组$options_schools的深度复制值,而不引用它。因此,当数组$options_schools变为 null 时,$options_schools_deepcopy仍然应该具有最初从$options_schools复制的值,无论它在代码中的何处访问。如何实现?

编辑1:请注意:正如您从我的代码中看到的那样,我正在尝试在if-else条件下将数组的副本$a$b。我希望$b具有相同的数组$a值,该值是在满足if-else时分配的。我希望$b将复制的数组保留在代码中的任何位置,无论它是否满足 if-else 条件,也无论数组$a如何变化。

Edit2:if-else 确实变为真,但仅在代码的某个点,那就是当 $options_schools 拥有我需要复制到 $options_schools_deepcopy 的所有值时。

实际上,没有必要尝试在 php 中深度复制数组。 PHP 在处理数组时使用一种称为写入复制和引用计数的方法。这是什么意思?这意味着,除非您这样做$options_schools_deepcopy = &$options_schools否则您实际上将获得数组的深层副本,因为如果对任一数组进行了更改,则对$options_schools_deepcopy内值的任何修改都将自动复制到内存中的新空间中。例如,请考虑以下代码:

$array1 = array("val1" => 1, "val2" => 2);
$array2 = &$array1;
$array2['val2']++;
echo "Saved as Reference:n";
echo $array2['val2'], "n";
echo $array1['val2'], "n";
unset($array1);
unset($array2);
$array1 = array("val1" => 1, "val2" => 2);
$array2 = $array1;
$array2['val2']++;
echo "Saved as Value:n";
echo $array2['val2'], "n";
echo $array1['val2'], "n";
unset($array1);
var_dump($array2);

Saved as Reference部分中,如果这是像Java这样的语言,你会得到你所期望的。 你得到一个数组,有两个引用指向它,$array2引用可以直接修改$array1指向的数据。 因此,通过$array2对数组的任何修改都会反映在$array1中。

但是,在Saved as Value部分中,您不会获得此行为。 相反,你得到的是指向创建的数组的两个引用(在对数组进行任何修改之前)。 在这种情况下,当您尝试修改$array2['val2']时,php 的写入复制方面开始发挥作用,它将原始数组复制到新分配的内存空间中,$array2指向这个新分配的位置,然后更新到$array2['val2']

因此,正如您所看到的,实际上没有必要尝试在 php 中制作数组的深层副本,因为 php 已经在幕后为您执行此操作,只要您不指定变量应该是对所述数组的引用。

我刚刚进行了一个小测试:

$a = array(1 => array(1 => 'X'));
$b = $a;
$a[1][1] = 'Z';
echo $b[1][1]; // X

我知道复制数组就像说$b = $a一样简单,但我不确定嵌套数组。 原来是一样的。

但是,数组中唯一会像这样复制的项目是标量值。

最新更新