私は意図的に重複した質問をすることですべてのルールを破っていると思います...
その他の質問 は回答を受け入れました。それは明らかに質問者の問題を解決しましたが、タイトルの質問には答えませんでした。
最初から始めましょう-first()
メソッドは、おおよそ次のように実装されます。
_foreach ($collection as $item)
return $item;
_
_$collection[0]
_を使用したり、他の推奨される方法を使用したりするよりも明らかに堅牢です。
コレクションに20個のアイテムがある場合でも、インデックス_0
_またはインデックス_15
_のアイテムがない場合があります。問題を説明するために、このコレクションをドキュメントから取り出しましょう:
_$collection = collect([
['product_id' => 'prod-100', 'name' => 'desk'],
['product_id' => 'prod-200', 'name' => 'chair'],
]);
$keyed = $collection->keyBy('product_id');
_
さて、_$keyed
_のn番目の項目にアクセスするための信頼できる(そしてできれば簡潔な)方法はありますか?
私自身の提案は次のようにすることです:
_$nth = $keyed->take($n)->last();
_
しかし、これは$keyed->last()
のときはいつでも間違った項目($n > $keyed->count()
)を与えます。 n番目のアイテムが存在する場合はどのように取得でき、null
はfirst()
のように動作しない場合はどのように動作しますか?
明確にするために、このコレクションを考えてみましょう:
_$col = collect([
2 => 'a',
5 => 'b',
6 => 'c',
7 => 'd']);
_
最初の項目は$col->first()
です。 2番目を取得する方法?
$col->nth(3)
は_'c'
_(または0ベースの場合は_'c'
_を返す必要がありますが、first()
と矛盾します)。 _$col[3]
_は機能せず、エラーを返すだけです。
$col->nth(7)
はnull
を返します。これは、7番目のアイテムがなく、4つしかないためです。 _$col[7]
_は機能せず、単に_'d'
_を返します。
質問を「foreach注文のn番目の項目を取得する方法」と言い換えることができます。一部の人にとってそれがより明確である場合。
より高速でメモリ効率の良い方法は slice()
メソッドを使用することだと思います:
$collection->slice($n, 1);
次のように values()
関数を使用してそれを試すことができます:
$collection->values()->get($n);
Alexeyの回答に基づいて、AppServiceProviderでマクロを作成できます(registerメソッド内に追加します)。
use Illuminate\Support\Collection;
Collection::macro('getNth', function ($n) {
return $this->slice($n, 1)->first();
});
その後、アプリケーション全体でこれを使用できます。
$collection = ['Apple', 'orange'];
$collection->getNth(0) // returns 'Apple'
$collection->getNth(1) // returns 'orange'
$collection->getNth(2) // returns null
$collection->getNth(3) // returns null
多分最良のオプションではないかもしれませんが、コレクション内の配列からアイテムを取得できます
$collection->all()[0]