Php 拉拉维尔的孩子们唯一的孩子
我想仅从Php 拉拉维尔的孩子们唯一的孩子,php,laravel,eloquent,Php,Laravel,Eloquent,我想仅从$collect中选择品牌名称,我该怎么做才能实现 当前: $collect = collect([ 0 => [ ['name' => 'iPhone 6S', 'brand' => ['name' => 'Apple', 'type' => 'brand', 'id' => 1]], ], 1 => [ ['name' => 'Galaxy S7', 'brand' => [
$collect
中选择品牌
名称
,我该怎么做才能实现
当前:
$collect = collect([
0 => [
['name' => 'iPhone 6S', 'brand' => ['name' => 'Apple', 'type' => 'brand', 'id' => 1]],
],
1 => [
['name' => 'Galaxy S7', 'brand' => ['name' => 'Samsung', 'type' => 'brand', 'id' => 2]],
],
]);
预期结果:
$collect = collect([
0 => [
['name' => 'iPhone 6S', 'brand' => ['name' => 'Apple']],
],
1 => [
['name' => 'Galaxy S7', 'brand' => ['name' => 'Samsung']],
],
]);
编辑
我尝试使用laravel提供的map()和each()集合,但没有一个有用
编辑(罗斯)
这起到了作用:
$collect->transform(function ($item) {
$itemData = collect($item);
return $itemData->transform(function ($item, $key) {
if($key == 'brand') {
$item = array_only($item, 'name');
}
return $item;
});
});
您可以使用
Collection
class执行类似操作,然后可以使用map
函数:
// Instantiate the collection
$collect = collect($collect);
$transformedArray = $collect->map(function($item) {
unset($item[0]['brand']['type']);
unset($item[0]['brand']['id']);
return $item;
})
或
如果您坚持不使用取消设置
$collect->map(function($item) {
$temp = [];
$temp[] = ['name' => $item[0]['name'],
'brand' => ['name' => $item[0]['brand']['name']]
];
return $temp;
})
在这个用例中,
map
更合适,因为我们基本上只是重新格式化结构您可以使用Collection
类执行类似操作,然后您可以使用map
函数:
// Instantiate the collection
$collect = collect($collect);
$transformedArray = $collect->map(function($item) {
unset($item[0]['brand']['type']);
unset($item[0]['brand']['id']);
return $item;
})
或
如果您坚持不使用取消设置
$collect->map(function($item) {
$temp = [];
$temp[] = ['name' => $item[0]['name'],
'brand' => ['name' => $item[0]['brand']['name']]
];
return $temp;
})
在这个用例中,
map
更合适,因为我们基本上只是重新格式化结构您可以执行以下操作:
$collect->transform(function ($item) {
return collect($item)->transform(function ($item) {
$item['brand'] = array_only($item['brand'], 'name');
return $item;
})->toArray();
});
希望这有帮助 您可以执行以下操作:
$collect->transform(function ($item) {
return collect($item)->transform(function ($item) {
$item['brand'] = array_only($item['brand'], 'name');
return $item;
})->toArray();
});
希望这有帮助 我需要找到一种方法来选择不删除,因为可能会出现新字段,并且我的列将被公开,这是不可预见的。@PHPLover Collection不会更改原始数据。您可以尝试检查
$collect
的值是否仍然是旧的,因为您的问题已更新。如果collect中有更多的属性,那么名称如何,为了保留它们,我必须将它们全部写在这里?@PHPLover在这种情况下,第一个方法工作得非常好。集合是一个不可变的对象,即使我使用了unset,它也不应该修改原始项。我需要找到一种方法来选择不删除,因为可能会出现新的字段,并且我的列将被公开,这是不可靠的。@PHPLover Collection不会更改原始数据。您可以尝试检查$collect
的值是否仍然是旧的,因为您的问题已更新。如果collect中有更多的属性,那么名称如何,为了保留它们,我必须将它们全部写在这里?@PHPLover在这种情况下,第一个方法工作得非常好。集合是一个不可变的对象,即使我使用了unset,它也不应该修改原始项,嗯?哈哈,我可以问一下,为什么你需要选择某些数据?下拉菜单?@MikeBarwick这个问题现在不同了。它不是下拉列表,但我试图不通过API公开数据。在这种情况下,只需foreach
。这是最安全、最干净、可读的代码。回头看,嗯?哈哈,我可以问一下,为什么你需要选择某些数据?下拉菜单?@MikeBarwick这个问题现在不同了。它不是下拉列表,但我试图不通过API公开数据。在这种情况下,只需foreach
。这是最安全、最干净、可读性最好的代码。你说的“选择”是什么意思?这是意料之中的事,谢谢。你们知道用拉威尔的地图集来改变这一切的方法吗?最好最干净的路线就是这条。不需要地图+1我在laravel的官方页面上看到了他们所做的事情:$collect->*->brand->name;但是再也找不到了。你说的“选择”是什么意思?这是意料之中的,谢谢。你们知道用拉威尔的地图集来改变这一切的方法吗?最好最干净的路线就是这条。不需要地图+1我在laravel的官方页面上看到了他们所做的事情:$collect->*->brand->name;但是再也找不到了。看起来代码不错,我得到了这个错误:array\u intersect\u key():Argument#1不是数组
@PHPLover您使用的是什么版本的Laravel?我使用的是,我注意到在转换中,您正在循环遍历Brandle的每个键,需要IF语句来检查该键。@PHPLover Cool。在这种情况下,与您的问题相比,您的代码中的数组似乎少了一级。看起来是好代码,我得到了以下错误:array\u intersect\u key(),我注意到,在transform中,您正在循环遍历Brand的每个键,可能需要一个IF语句来检查键。@PHPLover Cool。在这种情况下,与问题相比,代码中的数组级别似乎少了一级。