对象数组与一般数组的区别

一般数组,foreach会把值拷贝到循环变量中
对象数组,foreach会把值(对象)的引用拷贝循环变量中,因为是拷贝,所以将会改变原对象的值。

class a
{
    public $a = 10;
    public $b = 11;
    public $c = 12;
}

$instanceA = new a();
$instanceB = new a();

$arr = [$instanceA, $instanceB];
foreach ($arr as $key => $object) {
    $object->a = 100;
}

var_dump($arr);

执行结果:

array(2) {
  [0]=>
  object(a)#1 (3) {
    ["a"]=>
    int(100)
    ["b"]=>
    int(11)
    ["c"]=>
    int(12)
  }
  [1]=>
  object(a)#2 (3) {
    ["a"]=>
    int(100)
    ["b"]=>
    int(11)
    ["c"]=>
    int(12)
  }
}

可以看到属性a的值被修改了。
下面是一般数组的情况:

$arrA = [
    10, 11, 13
];

$arrB = [
    10, 11, 13
];

$arr = [$arrA, $arrB];
foreach ($arr as $key => $object) {
    $object[0] = 100;
}

var_dump($arr);

执行结果:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    int(10)
    [1]=>
    int(11)
    [2]=>
    int(13)
  }
  [1]=>
  array(3) {
    [0]=>
    int(10)
    [1]=>
    int(11)
    [2]=>
    int(13)
  }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
只不过是一粒尘埃罢了
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
foreach ($arr as $key => &$object) {
    $object[0] = 100;
}

这样写就可以了,具体可以看一下PHP对象赋值和普通变量赋值的区别,也就是深拷贝和浅拷贝的区别

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!