PHP嵌套循环中为对象添加bku键值对时无法实现值递增的问题
问题:PHP嵌套循环中为对象添加递增键值对失败
我尝试在PHP的嵌套循环中为对象添加键为bku的键值对,当前使用的循环代码如下:
$newarray = []; foreach($allJobs as $allJob) { for($i = 0; $i < 2 ; $i++){ $allJob->bku = $i; $newarray[] = $allJob; } }
当前输出结果中,两个对象的bku值均为1:
Array ( [0] => stdClass Object ( [id] => CFF9B1A6-37B8-4000-B058-03DC648B5289 [name] => Kreditor rapporter til RE pkt. 5 [bku] => 1 ) [1] => stdClass Object ( [id] => CFF9B1A6-37B8-4000-B058-03DC648B5289 [name] => Kreditor rapporter til RE pkt. 5 [bku] => 1 ) )
但我期望的输出是bku值依次递增为0和1:
Array ( [0] => stdClass Object ( [id] => CFF9B1A6-37B8-4000-B058-03DC648B5289 [name] => Kreditor rapporter til RE pkt. 5 [bku] => 0 ) [1] => stdClass Object ( [id] => CFF9B1A6-37B8-4000-B058-03DC648B5289 [name] => Kreditor rapporter til RE pkt. 5 [bku] => 1 ) )
解决方法
这是因为PHP中对象是引用传递的,你每次循环修改的都是同一个对象实例,$newarray里保存的都是这个对象的引用。当循环结束时,对象的bku被最后一次赋值为1,所以数组里所有元素的bku都是1。
要解决这个问题,每次循环时都需要克隆一个新的对象实例,再给新对象赋值bku:
$newarray = []; foreach($allJobs as $allJob) { for($i = 0; $i < 2 ; $i++){ // 克隆原对象,创建新的实例 $cloneJob = clone $allJob; $cloneJob->bku = $i; $newarray[] = $cloneJob; } }
这样$newarray里的每个元素都是独立的对象实例,各自的bku值会是0和1。
内容的提问来源于stack exchange,提问作者Frederik Nielsen
相关产品推荐
相关产品推荐

