web-dev-qa-db-ja.com

Laravelコレクションのn番目のアイテムにアクセスする方法は?

私は意図的に重複した質問をすることですべてのルールを破っていると思います...

その他の質問 は回答を受け入れました。それは明らかに質問者の問題を解決しましたが、タイトルの質問には答えませんでした。

最初から始めましょう-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番目のアイテムが存在する場合はどのように取得でき、nullfirst()のように動作しない場合はどのように動作しますか?

編集する

明確にするために、このコレクションを考えてみましょう:

_$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番目の項目を取得する方法」と言い換えることができます。一部の人にとってそれがより明確である場合。

11
Džuris

より高速でメモリ効率の良い方法は slice() メソッドを使用することだと思います:

$collection->slice($n, 1);
13
Alexey Mezenin

次のように values() 関数を使用してそれを試すことができます:

$collection->values()->get($n);
8
Amit Gupta

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
2
Muhammad Syauqy

多分最良のオプションではないかもしれませんが、コレクション内の配列からアイテムを取得できます

$collection->all()[0] 
1
tylik