2016-08-24 3 views
1

Вот небольшая проблема для Laravel :-) фанатовКак сцепить значение коллекции Laravel

Я хочу, чтобы создать простой список сегментов запроса по их URL.

Я начинаю с:

// 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() без успеха.

Как говорит Адам Ватан: «Никогда не пишите еще один цикл». ;-)

ответ

1

Существует довольно много способов сделать это, но поскольку вы неизбежно потребуете знания прошлых предметов, я бы предложил использовать 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" 
    ] 
} 

Не утверждая, что это каким-либо образом оптимизированы, но это работает. :)

+0

Это именно то, что я искал ... Я упустил документы и пропустил метод 'reduce(). –

+0

Рад, что вам понравилось. :) –

Смежные вопросы