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

sun*_*kin 1 php arrays copy

这是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, '');    
Run Code Online (Sandbox Code Playgroud)

我希望数组$options_schools_deepcopy承载数组的深拷贝值$options_schools而不引用它.因此,当数组$options_schools变为null时,代码中的某处$options_schools_deepcopy仍应具有最初复制的值,$options_schools而不管代码中的访问位置如何.怎么实现呢?

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

Edit2: if-else确实变为true但仅在代码的某一点,并且$ options_schools具有我需要复制到$ options_schools_deepcopy的所有值.

eli*_*f21 5

真的没有必要尝试在php中深度复制数组.在处理数组时,Php在写入和引用计数时使用称为copy的方法.这是什么意思?这意味着除非您这样做,否则您$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);
Run Code Online (Sandbox Code Playgroud)

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

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

所以你可以看到,实际上没有必要尝试在php中创建一个数组的深层副本,因为php已经在幕后为你做了这个,只要你没有指定一个变量应该是一个引用说阵.

  • 在if语句中执行此操作$ options_schools_deepcopy = $ options_schools; 应该准确地给你你想要的东西.只要满足并且这条线被执行了$ options_schools_deepcopy = $ options_schools; 那么$ options_schools_deepcopy将包含$ options_schools的"深层副本",并且在此声明之后对$ options_schools的任何更改都不会反映在所制作的副本中 (2认同)