【问题标题】:Issue with modifying array in foreach and understading why在 foreach 中修改数组并理解原因的问题
【发布时间】:2017-09-27 15:44:33
【问题描述】:

我总是做类似的事情

例如来自我在 Laravel 的上一个项目

foreach( $sections as $section )
{
    $section->date = Carbon::parse($section->date)->diffForHumans();
}

而且效果很好。没问题,数组已按我的意愿修改

但现在我做到了

$events = $this->events;
        foreach($events as $event)
        {
            $date = new \DateTime($event['date']);
            $event['date'] = (int)$date->format('d');
            echo $event['date'];
            var_dump($event);
        }
        var_dump($events);
        $this->events = $events;

而且它不能按我的意愿工作,循环内和循环外的值不同。

我一直在寻找不好的地方,但我发现了它的含义,给& 或做 foreach $key => $value...

不过没关系。

但事实并非如此。

因为我知道。我记得。我做了很多次就像

foreach($a as $b)
{
    $b = .......
}

它奏效了。但现在不是。

所以我不明白。但我必须并且想要。

我正在寻找答案,但可以找到它。

为什么有时它对我如此有效,而其他时候却不起作用,我需要 apersand 或 key => 价值玩?

请谅解

为什么一次有效,另一次无效。

【问题讨论】:

  • 它永远不会与foreach($a as $b) 一起使用,必须为foreach($a as &$b)foreach($a as $k => $b) { $a[$k] = 'something'; } 用于数组。 foreach($a as $b) 适用于通过引用访问的对象。
  • @AbraCadaver foreach($a as $b) 将工作如果$b对象
  • @u_mulder:是的,我记得这一点并进行了测试。
  • 所以,OP 问题的答案是,在一种情况下它是一个对象,而在另一种情况下它是数组。

标签: php arrays foreach reference


【解决方案1】:

foreach 迭代数组的副本,因此除非您创建引用,否则仅对该临时副本进行数组元素的修改:

foreach($a as &$b) {
    $b = 'something';
}

或者按键修改原数组:

foreach($a as $k => $b) {
    $a[$k] = 'something';
}

对于对象数组,该数组是一个copy,但copy 中的对象是对原始数组的引用。所以对 copy 中对象的修改会反映在原始数组中:

foreach($a as $b) {
    $b->var = 'something';
}

【讨论】:

  • +1 for this "对于对象数组,数组是一个副本,但副本中的对象是对原始数组的引用。因此对副本中对象的修改会反映在原始数组中数组”
  • 从技术上讲,它们并不是真正的参考,它们是copies of the object identifiers。 (据我所知,这并没有什么实际的区别。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多