对于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所说:“再也不要写另一个循环。” ; - )
答案 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" ]