【问题标题】:Creating a collection from a multidimensional array?从多维数组创建集合?
【发布时间】:2023-04-02 12:56:01
【问题描述】:

我正在尝试从一些数据数组中收集:

$myCollection = collect(
    ['product_id' => 1, 'price' => 200, 'discount' => '50'],
    ['product_id' => 2, 'price' => 400, 'discount' => '50']
);

当我循环出去时,我想做:

foreach ($myCollection as $product) {
    echo $product->price;
    echo $product->discount;
}

但底层元素似乎仍然是数组格式,我怎样才能实现上述输出?

【问题讨论】:

  • 以下任何答案都没有解决您的问题吗?

标签: laravel laravel-5 laravel-5.4


【解决方案1】:

您的集合定义中有语法错误:

$myCollection = collect([
    ['product_id' => 1, 'price' => 200, 'discount' => '50'],
    ['product_id' => 2, 'price' => 400, 'discount' => '50']
]);

此外,由于您使用的是Collection,因此您不再需要使用foreach 循环:

$myCollection->each(function ($item) {
    echo $item['price'];
})

【讨论】:

  • 试图获取非对象的属性
  • 不工作:`#message:“尝试获取非对象的属性”`
  • 编辑仍然无法工作。此集合实例上不存在属性 [价格]
  • 其实不需要把它定义为集合的集合
  • 第二次编辑返回尝试获取非对象的属性
【解决方案2】:

很简单,因为您正在收集数组元素,因此您正在收集关联数组的集合,因此如果您需要它作为数组,集合助手不想修改它。

知道了这一点,如果你想收集对象,你应该传递一个对象类型的元素。

您可以将对象数据类型转换为数组,如下所示:

$myCollection = collect( (object) array(
     (object)  ['product_id' => 1, 'price' => 200, 'discount' => '50'],
     (object)  ['product_id' => 2, 'price' => 400, 'discount' => '50'])
);

那么你就有了一个对象的集合!

【讨论】:

  • 谢谢,但你为什么要使用一个对象,为什么不收集只是工作?
  • @panthro 您正在收集一组关联数组元素,因此如果您需要它作为关联数组,集合助手不想修改它。如果你想收集对象,你应该传递一个对象类型的元素:)
  • 啊,这是我一直在寻找的缺失链接!
【解决方案3】:

函数 collect() 接受元素数组。您还可以通过将所有元素包含在 [] 中,然后将 Collection 元素转换为对象而不是将它们保留为数组来修复您的代码

    $myCollection = collect([
        (object)(['product_id' => 1, 'price' => 200, 'discount' => '50']),
        (object)(['product_id' => 2, 'price' => 400, 'discount' => '50'])
            ]
    );
    foreach ($myCollection as $product) {
        echo $product->price;
        echo $product->discount;
    }

【讨论】:

【解决方案4】:

如果你想让内部数组成为一个集合,那么你可以这样做:

$myCollection = collect([
    ['product_id' => 1, 'price' => 200, 'discount' => '50'],
    ['product_id' => 2, 'price' => 400, 'discount' => '50']
])->map(function($row) {
    return collect($row);
});

如果你希望内部数组是对象,那么你可以这样做:

$myCollection = collect([
    ['product_id' => 1, 'price' => 200, 'discount' => '50'],
    ['product_id' => 2, 'price' => 400, 'discount' => '50']
])->map(function($row) {
    return (object) $row;
});

您还可以遍历每个结果...

$myCollection = collect([
    ['product_id' => 1, 'price' => 200, 'discount' => '50'],
    ['product_id' => 2, 'price' => 400, 'discount' => '50']
])->map(function($row) {
    return (object) $row;
})->each(function($row) {
    echo sprintf('ProductId: %d, Price: %d, Discount: %s'.PHP_EOL, $row->product_id, $row->price, $row->discount);
});

输出:

ProductId: 1, Price: 200, Discount: 50
ProductId: 2, Price: 400, Discount: 50

【讨论】:

  • 如果我想将此输出保存到数组 $arr;我曾尝试使用 $arr[] = "Product Id: ......" 但它不允许我这样做......
猜你喜欢
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多