2017-03-08 1 views
1

あなたはLaravelのコレクションを使用して簡単なmapを持っている場合、あなたは簡単に次のようにして、ベースコレクションにアクセスすることはできません。流暢なチェーンを壊さずにコレクションマップ内のアイテムにアクセスするには?

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

質問

は、それが修正さitems配列、またはalternativelのいずれかにアクセスすることが可能ですy、その現在の状態のコレクションにアクセスします。 JavaScriptで

同様のライブラリは、lodashのように、3番目の引数としてコレクションに渡す - 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

あなたはmap()d($items);を行うと、それはあなたの元の配列を指します。あなたは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'は、それが上記の操作で拒否されたとして(この場合は)「猫」を含んでいないコレクションを指します。 '$ items'変数は、コレクションパイプラインのすべての操作の結果であるコレクションを指します。 –

+0

私は答えを感謝しますが、 '$ this'は現在のコンテキストを参照しています - 例えば:https://gist.github.com/cjke/fa0e152b5d57da41e74e5027446984d4' $ this'は 'RouteServiceProvider'を指します – Chris

関連する問題