【问题标题】:Add value to new collection为新系列增加价值
【发布时间】:2018-10-18 09:49:26
【问题描述】:

我创建了一个新的collection,当我尝试在foreach 循环中使用键添加新值时,它不起作用。它只附加第一个值。我希望它全部添加。

这是我的代码:

$new = new Collection();

foreach($messages as $message){
 $new['message'] = $message->message;
}

但最终不是返回所有消息,而是只返回第一条消息:

{"message":"first"}

相反,它应该返回

{"message": "first", "message": "second"}

有什么问题?

此外,当我在不提供集合键的情况下执行此操作时,它会全部返回:

foreach($messages as $message){
     $new = $message->message;
}

【问题讨论】:

  • $collection = collect($messages) 现在你已经收集了消息。无论如何,您对数组缺乏了解,$a['message'] = 'first'; $a['message'] = 'second' 这里会发生什么,如果您打印$a,您会看到message = 'second',为什么?因为每个数组的键是唯一的,所以集合也是如此。

标签: arrays laravel collections foreach


【解决方案1】:

您有一个具有相同键的数组,因此 for 循环会一次又一次地覆盖相同的值。

如果您想要一个包含具有相同键的对象的集合,您可以根据需要更改以下代码:

$new = array();
foreach ([1, 2, 3] as $i) {
  $new[] = array('message' => $i);
}
$collection = collect($new);

【讨论】:

  • 是的,它成功了!非常感谢……就像它变得非常混乱一样,我知道答案很简单,但是……
【解决方案2】:

您使用 1 个密钥创建集合:即 "message",然后在循环期间继续覆盖此密钥。因此,PHP 会如您的问题所示处理此问题:具有 1 个键和 1 个值的集合。

这完全有道理(例如,您的家庭住址上有几栋房子?只有一栋是对的?如果有 16 栋房子的地址完全相同,您的邮件会怎样?)。

您想要的根本不可能:如果整个数据结构都由同一个键组成,那么当您请求"message" 的值时,PHP 应该如何知道它应该返回什么?

【讨论】:

    【解决方案3】:

    测试这段代码:

    $messages=['ali','reza','sara'];
    $new = new Collection();
    foreach($messages as $key=>$message){
        $new->prepend($message,$key);
    }
    
    dd($new);
    

    输出:

    Collection {#475 ▼
    #items: array:3 [▼
    2 => "sara"
    1 => "reza"
    0 => "ali"
    ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 2014-06-30
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      相关资源
      最近更新 更多