Laravel 集合将数组转换为对象
Laravel collection converts array to object
如果我 运行 $collection->filter(myFilter)
,Laravel 会像这样向集合中的每个模型添加键,这很烦人:
{
"4": {
"myObject": "data"
},
"7": {
"myObject": "data"
}
}
如何去掉“4”和“7”,使其成为我的对象数组?
我的 运行 代码是:
$obj = Cars::with('brand')->orderBy('id')->get();
return $obj->filter(function($value, $key)
{
return $value->display == true;
});
对您的集合调用 flatten()
应该删除键并将它们的所有值合并到一个集合中。
问题是 filter()
方法不会重新键入基础集合数组。所以,Collection 仍然代表一个数组,只是你的数组看起来像这样:
[
4 => Object4,
7 => Object7,
]
虽然这在 PHP 中是一个完全有效的数组,但在 JSON 中这不是一个正确的数组。由于this在JSON中不能表示为数组,所以在JSON中转换为对象。
为了在 JSON 中将其正确表示为数组,您只需重新键入 Collection 数组。正确的方法是 values()
方法。它所做的只是在底层数组上调用 array_values
。这将把上面的数组变成这样:
[
0 => Object4,
1 => Object7,
]
现在,这是一个适当的数字索引数组,JSON 可以理解并将其视为数组而不是对象。
虽然 flatten
可能适用于这种特殊情况(您的集合是 Eloquent 模型的集合),但它实际上并不是正确的方法,并且可能会导致意想不到的后果。此外,它将执行许多不需要的额外逻辑。你最好的选择是使用正确的方法来实现你想要实现的目标,那就是 values()
方法。
$obj = Cars::with('brand')->orderBy('id')->get();
return $obj->filter(function($value, $key)
{
return $value->display == true;
})
->values();
如果我 运行 $collection->filter(myFilter)
,Laravel 会像这样向集合中的每个模型添加键,这很烦人:
{
"4": {
"myObject": "data"
},
"7": {
"myObject": "data"
}
}
如何去掉“4”和“7”,使其成为我的对象数组?
我的 运行 代码是:
$obj = Cars::with('brand')->orderBy('id')->get();
return $obj->filter(function($value, $key)
{
return $value->display == true;
});
对您的集合调用 flatten()
应该删除键并将它们的所有值合并到一个集合中。
问题是 filter()
方法不会重新键入基础集合数组。所以,Collection 仍然代表一个数组,只是你的数组看起来像这样:
[
4 => Object4,
7 => Object7,
]
虽然这在 PHP 中是一个完全有效的数组,但在 JSON 中这不是一个正确的数组。由于this在JSON中不能表示为数组,所以在JSON中转换为对象。
为了在 JSON 中将其正确表示为数组,您只需重新键入 Collection 数组。正确的方法是 values()
方法。它所做的只是在底层数组上调用 array_values
。这将把上面的数组变成这样:
[
0 => Object4,
1 => Object7,
]
现在,这是一个适当的数字索引数组,JSON 可以理解并将其视为数组而不是对象。
虽然 flatten
可能适用于这种特殊情况(您的集合是 Eloquent 模型的集合),但它实际上并不是正确的方法,并且可能会导致意想不到的后果。此外,它将执行许多不需要的额外逻辑。你最好的选择是使用正确的方法来实现你想要实现的目标,那就是 values()
方法。
$obj = Cars::with('brand')->orderBy('id')->get();
return $obj->filter(function($value, $key)
{
return $value->display == true;
})
->values();