2017-03-08 76 views
1

如果你有一個簡單map使用Laravel集合,你可以很容易地做訪問基集合以下幾點:如何在不破壞流暢鏈的情況下訪問集合映射中的項目?

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

如果使用帶有過濾器/拒絕流暢鏈,$項目不再代表組項目:

$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); 
    }); 

問題

是否有可能訪問或者修改的項目陣列,或alternativel y,以當前狀態訪問收藏集。

Javascript中的類似庫,如lodash,作爲第三個參數傳入集合 - Laravel集合沒有。

更新/編輯

要清楚,我可以這樣做(但它打破了鏈)。我想要做以下事情,但沒有收集的中間存儲。

$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); 
     }); 

回答

0

當你d($items);map()它指的是你原來的數組。如果你在map()裏面輸入var_dump($item),你會發現它只輸出獨角獸

$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 
+0

我也許不清楚 - 我會更新這個問題。我期待在每次迭代中訪問*整個*,並可能減少收集 – Chris

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); 
    }); 
+0

你是否願意? '$ this'指的是當前的對象/實例(是的,可以訪問'items'),​​但是$ items仍然是原始的未修改版本。無論如何,這就是我的理解 – Chris

+0

是的,我相信。由於Laravel集合是不可變的,因此'$ this'是指一個集合(在本例中)不包含'cat',因爲它在上面的操作中被拒絕。 '$ items'變量指向一個集合,它是集合管道中所有操作的結果。 –

+0

我很欣賞這個答案,但'$ this'指的是當前的上下文 - 例如:https://gist.github.com/cjke/fa0e152b5d57da41e74e5027446984d4'$ this'將引用'RouteServiceProvider' – Chris

相關問題