如何连接laravel集合的值

时间:2016-08-24 19:45:54

标签: php laravel collections

对于Laravel粉丝来说,这是一个小小的挑战: - )

我想在其网址上构建一个简单的请求段列表。

我从:

开始
// http://domain/aaa/bbb/ccc/ddd
$breadcrumbs = collect(explode('/', $request->path()))

但我不知道如何映射到一个类似于

的集合
$breadcrumbs = collect([
    ['title' => 'aaa', 'link' => 'http://domain/aaa'],
    ['title' => 'bbb', 'link' => 'http://domain/aaa/bbb'],
    ['title' => 'ccc', 'link' => 'http://domain/aaa/bbb/ccc'],
    ['title' => 'ddd', 'link' => 'http://domain/aaa/bbb/ccc/ddd'],
])

我可以使用for循环轻松完成,但我正在寻找一种非常优雅的方法。我尝试使用map()each()但没有成功。

正如Adam Wathan所说:“再也不要写另一个循环。” ; - )

2 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点,但由于你不可避免地需要了解过去的项目,我建议使用reduce()。这是一个基本的例子,它将向您展示如何构建字符串。您可以轻松添加链接,将进位转换为数组等。

collect(['aaa', 'bbb', 'ccc', 'ddd'])
    ->reduce(function ($carry, $item) {
        return $carry->push($carry->last() . '/' . $item);
    }, collect([]));

结果

Illuminate\Support\Collection {#928
    #items: array:4 [
        0 => "/aaa"
        1 => "/aaa/bbb"
        2 => "/aaa/bbb/ccc"
        3 => "/aaa/bbb/ccc/ddd"
    ]
}

不以任何方式声称它是优化的,但确实有效。 :)

答案 1 :(得分:0)

这是古老的方法,但方法有所不同-可在Laravel 5.1及更高版本中使用。

//your collection
$breadcrumbs = collect([
    ['title' => 'aaa', 'link' => 'http://domain/aaa'],
    ['title' => 'bbb', 'link' => 'http://domain/aaa/bbb'],
    ['title' => 'ccc', 'link' => 'http://domain/aaa/bbb/ccc'],
    ['title' => 'ddd', 'link' => 'http://domain/aaa/bbb/ccc/ddd'],
])

//one-liner to get you what you want
$result = explode(',', $breadcrumbs->implode('link', ','));

//here is what you will get:
array:4 [▼
  0 => "http://domain/aaa"
  1 => "http://domain/aaa/bbb"
  2 => "http://domain/aaa/bbb/ccc"
  3 => "http://domain/aaa/bbb/ccc/ddd"
]