如何在不破坏流畅链的情况下访问集合图中的项目?

时间:2017-03-08 08:44:43

标签: php laravel laravel-5 laravel-collection

如果您使用Laravel集合有一个简单的map,则可以通过执行以下操作轻松访问基本集合:

$items = [ "dog", "cat", "unicorn" ];
collect($items)->map(function($item) use ($items) {
    d($items); // Correctly outputs $items array
});

如果使用包含过滤/拒绝的流畅链,则$ items不再代表项目集:

$items = [ "dog", "cat", "unicorn" ];
collect($items)
    ->reject(function($item) {
        // Reject cats, because they are most likely evil
        return $item == 'cat'; 
    })->map(function($item) use ($items) {
        // Incorrectly (and obviously) outputs $items array (including "cat");
        // Would like to see the $items (['dog', 'unicorn']) here
        d($items);

        // Will correctly dump 'dog' on iteration 0, and 
        // will correctly dump 'unicorn' on iteration 1 
        d($item); 
    });

问题

是否可以访问修改后的items数组,或者可以访问当前状态的集合。

Javascript中的类似库,如lodash,将集合作为第三个参数传递 - Laravel集合没有。

更新/修改

要清楚,我可以做类似的事情(但它打破了链条)。我想做以下,但没有集合的inbetween存储。

    $items = [ "dog", "cat", "unicorn" ];
    $items = collect($items)
        ->reject(function($item) {
            // Reject cats, because they are most likely evil
            return $item == 'cat'; 
        });

    $items->map(function($item) use ($items) {
            // This will work (because I have reassigned 
            // the rejected sub collection to $items above)
            d($items);

            // Will correctly dump 'dog' on iteration 0, and 
            // will correctly dump 'unicorn' on iteration 1 
           d($item); 
        });

2 个答案:

答案 0 :(得分:0)

当你在d($items);map()时,它指的是你的原始数组。如果您在var_dump($item)map()进行$items = [ "dog", "cat", "unicorn" ]; $newItems = collect($items) ->reject(function($item) { // Reject cats, because they are most likely evil return $item == 'cat'; })->map(function($item) use ($items) { var_dump( $item );//TODO }); var_dump( $newItems );//TODO ,则会看到它仅输出 dog 独角兽

$(selector).trigger("change");

答案 1 :(得分:0)

您可以通过运行$this->all()

之类的内容来访问集合的当前状态
$items = collect(["dog", "cat", "unicorn"])
    ->reject(function($item) {
        return $item == 'cat'; 
    })
    ->map(function($item) {
        dd($item); // current item (dog/unicorn);
        dd($this->all()); // all items in the collection (dog and unicorn);
    });