22

わざと重複した質問をすることで、すべてのルールを破っていると思います...

もう1つの質問には、受け入れられた回答があります。質問者の問題は明らかに解決しましたが、タイトルの質問には答えませんでした。

最初から始めましょう -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');

さて、 の n 番目の項目にアクセスするための信頼できる (できれば簡潔な) 方法はあり$keyedますか?

私自身の提案は、次のことです。

$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'(または'c'0 ベースの場合、それは と矛盾しfirst()ます)。$col[3]動作しません。エラーが返されるだけです。

$col->nth(7)null7 番目のアイテムがなく、4 つしかないため、戻る必要があります。$col[7]動作しません。単に返され'd'ます。

この質問は、「foreach オーダーで n 番目のアイテムを取得する方法は?」と言い換えることができます。一部の人にとってより明確であれば。

4

5 に答える 5

6

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
于 2019-05-03T10:32:06.710 に答える