Laravel集合 - 列出多个值

Jef*_*eff 2 collections laravel laravel-5.2

我正在寻找一个集合并返回包含集合中两个字段的平面数组.我想要的是:

$collection = new Collection([
    [
        "a"=>"a1",
        "b"=>"b1",
        "c"=>"c1"
    ],
    [
        "a"=>"a2",
        "b"=>"b2",
        "c"=>"c2"
    ],
    [
        "a"=>"a3",
        "b"=>"b3",
        "c"=>"c3"
    ]
]);

//desired output:
[
    ["a1","b1"],
    ["a2","b2"],
    ["a3","b3"]
];
Run Code Online (Sandbox Code Playgroud)

我会认为这是一个功能,但它不是:

$collection->lists(["a","b"]);
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案看起来效率不高,因为它们可能有数千行:

$collection->lists("a")->zip($collection->lists("b"));
Run Code Online (Sandbox Code Playgroud)

有没有我失踪的功能?谢谢.

编辑:我也像这样使用地图:

$collection->map(function($row)){
    return [$row['a'],$row['b']];
}
Run Code Online (Sandbox Code Playgroud)

这似乎比我想要的更加习惯.如果没有本地方式,我最终可能会使用此函数为Collection编写包装器.

Leo*_*mer 9

如果您想要专门使用集合,可以扩展当前的Collections API,因为它是可宏的,执行如下操作:

Collection::macro('pluckMultiple', function ($assoc) {
    return $this->map(function ($item) use ($assoc) {
        $list = [];
        foreach ($assoc as $key) {
            $list[$key] = data_get($item, $key);
        }
        return $list;
    }, new static);
});
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我将键作为返回的一部分包含在内,但可以删除它.

$collection->pluckMultiple(['a', 'b']);
Run Code Online (Sandbox Code Playgroud)

会给你你想要的东西.

如果您想从Eloquent集合中提取项目,上述方法可以很好地工作,例如:

$books = Book::with('author')->get();
$books->pluckMultiple(['title', 'author.name', 'author.surname']);
Run Code Online (Sandbox Code Playgroud)


nex*_*tt1 5

您可以使用

$plucked = $collection->pluck('b','a');

$plucked->all();
Run Code Online (Sandbox Code Playgroud)

这将得到以下结果

Collection {#651 ?
#items: array:3 [?
"a1" => "b1"
"a2" => "b2"
"a3" => "b3"
]}
Run Code Online (Sandbox Code Playgroud)

并使用此代码来获取给定的格式

foreach ($plucked as $key => $item)
{
 $temp[] = [ $key, $item];
}
Run Code Online (Sandbox Code Playgroud)

这将给出以下结果.

array:3 [?
 0 => array:2 [?
  0 => "a1"
  1 => "b1"
  ]
 1 => array:2 [?
  0 => "a2"
  1 => "b2"
  ]
 2 => array:2 [?
  0 => "a3"
  1 => "b3"
 ]
]
Run Code Online (Sandbox Code Playgroud)