4

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

$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;
}

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

4

4 回答 4

12

如果你希望内部数组是一个集合,那么你可以这样做:

$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
于 2017-02-08T15:32:33.730 回答
5

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

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

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

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

然后你有一个对象的集合!

于 2017-02-08T15:25:52.130 回答
0

函数 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;
    }
于 2017-02-08T15:29:05.873 回答
-1

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

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

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

$myCollection->each(function ($item) {
    echo $item['price'];
})
于 2017-02-08T15:18:36.967 回答