Laravel map():如何改变对象和数组?

Posted

技术标签:

【中文标题】Laravel map():如何改变对象和数组?【英文标题】:Laravel map(): How to alter objects and arrays? 【发布时间】:2016-04-20 20:35:09 【问题描述】:

我有一个多维集合。我想迭代它并使用 map() 函数更改它的一些子对象和数组:https://laravel.com/docs/5.1/collections#method-map

示例内容:

[
    
        'address': 'Somestreet 99'
        'orders': [
            'id': 11,
            'id': 67
        ]
    
]

例子

  $deliveries = $delivery_addresses->map(function($delivery_address)
     $orders = $delivery_address->orders->filter(function($order)
        return $order->id == 67;
     );

     $delivery_address['address'] = 'A different street 44'
     $delivery_address['orders'] = $orders;
     $delivery_address['a_new_attribute'] = 'Some data...';

     return $delivery_address;
  );

预期结果:

[
    
        'address': 'A different street 44'
        'orders': [
            'id': 67
        ],
        'a_new_attribute': 'Some data...;
    
]

结果是只有字符串类型的变量会被改变。任何数组或对象都将保持不变。为什么会这样以及如何解决它?谢谢! =)

【问题讨论】:

您是否有一个示例集合可以提供您所描述的结果?修改地图内的各种数据应该会产生预期的结果,因为集合的元素只会被您从回调中返回的内容覆盖。 您能否发布您正在执行的真实代码,而不是一些伪代码? $old_collection.map 在 php 中不起作用 您能否发布一个想要的结果,以及您实际得到的结果?我也很好奇您为什么将 $delivery_address 作为对象访问,然后稍后将键分配为数组。 @Emn1ty Laravel 对它们一视同仁。 @Sturm -- 好吧,虽然我不知道我还发现了一大罐不应该打开的蠕虫。 :P 永远不应该让人们将对象视为数组。但这是另一天的话题,感谢您提供的信息。 【参考方案1】:

解决您最近的编辑,试试这个:

$deliveries = $deliver_addresses->map(function($da) 
    $orders = $da->orders->filter(function($order) 
        return $order->id == 67;
    );

    $da->unused_attribute = $orders->all();

    return $da;
);

这里最有可能的情况是您正确地覆盖了该属性。然后,当您尝试访问它时,Laravel 正在查询 orders() 关系并撤消您的更改。就 Laravel 而言,这些是相同的:

$delivery_address->orders;
$delivery_address['orders'];

这就是为什么更改仅适用于对象。如果您想永久保存,则实际保存,如果不使用临时属性来包含该数据。

【讨论】:

这听起来很合理。的确,我可以为集合添加新属性。 由于不想保存任何数据,只需将其打印为 JSON,我正在考虑将集合转换为数组,然后使用可用的内容 - 例如 foreach()... 【参考方案2】:
collect($deliver_addresses)->map(function ($address) use ($input) 

    $address['id']              = $input['id'];
    $address['a_new_attribute'] = $input['a_new_attribute'];

    return $address;

);

【讨论】:

@Al0x 这会将 id 和 a_new_attribute 这两个属性添加到您的对象中 你太棒了,我也在尝试相同的方法,但缺少 use($param) 位,因此无法访问 map 函数之外的数据。 @MayuriPansuriya 赞成,但最好在答案中包含一些解释,而不是仅仅发布代码【参考方案3】:

$paymentMethods = $user->paymentMethods()->map(function($paymentMethod)
            return $paymentMethod->asStripePaymentMethod();
        );

【讨论】:

以上是关于Laravel map():如何改变对象和数组?的主要内容,如果未能解决你的问题,请参考以下文章

php常用数组函数

Laravel - 我如何发布对象数组?

laravel array_map 得到错误“array_map(): 参数 #2 应该是一个数组”

如何使用 vform 将对象数组传递给 laravel

深度复制的坑1对象assign复制的假深度,2数组slice复制的坑,3还有数组map复制的坑

如何在laravel中搜索具有数组属性的对象数组