【问题标题】:How to deep copy an array in PHP from foreach loop?如何从 foreach 循环中深度复制 PHP 中的数组?
【发布时间】:2014-01-21 15:55:15
【问题描述】:

这里是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 变为空时,代码中的某处,$options_schools_deepcopy 仍应具有最初从$options_schools 复制的值,而不管在代码中的何处访问它。如何实现?

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

编辑2: if-else 确实成立,但仅在代码的某个点,即当 $options_schools 具有我需要复制到 $options_schools_deepcopy 的所有值时。

【问题讨论】:

  • 这可能会为您指明正确的方向。 stackoverflow.com/questions/894814/…
  • 使用 $options_schools_deepcopy[]= $options_schools; 而不是 $options_schools_deepcopy= $options_schools; 并放入您的循环中。
  • @Tounu 我试过了。它不起作用。对不起
  • 我实际上不明白你的问题。您希望 $options_schools_deepcopy 等于 $options_scools 吗?然后你的代码工作。我看不出你的问题出在哪里。
  • 你测试了吗?此代码应该已经为您提供了 2 个您想要的独立数组。

标签: php arrays copy


【解决方案1】:

真的没有必要尝试在 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 已经在幕后为您执行此操作,只要您不指定变量应该成为对所述数组的引用。

【讨论】:

  • +1 很好的解释!谢谢!但是,我的问题几乎没有。请参阅我更新的问题。我添加了一个“Edit1”以明确我的意图
  • 在 if 语句中执行此操作 $options_schools_deepcopy = $options_schools;应该给你你想要的。只要满足 if 并执行此行 $options_schools_deepcopy = $options_schools;那么 $options_schools_deepcopy 将包含 $options_schools 的“深层副本”,并且在此声明之后对 $options_schools 的任何更改都不会反映在所做的副本中
【解决方案2】:

我只是做了一个小测试:

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

echo $b[1][1]; // X

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

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

【讨论】:

  • 感谢您的回复。正如您从我的代码中看到的那样,我试图在 if-else 条件下将 $a 复制到 $b 中。我希望 $b 具有与满足 if-else 时分配的数组 $a 相同的值。我希望 $b 将复制的数组保留在代码中的任何位置,即使在 if-else 条件之外。
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 2014-05-04
  • 2013-07-10
  • 2010-12-13
  • 2012-06-15
  • 2014-09-19
相关资源
最近更新 更多