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。在这种情况下,与问题相比,代码中的数组级别似乎少了一级。