2016-05-29 13 views
3

特定のキーを持つ別の要素の直後に、Laravelコレクションに要素を挿入しようとしています。ような何か:私は後でビューで出力HTMLにそれを使用することになりますので指定されたキーを持つ要素の後にLaravelコレクションに要素を挿入する方法は?

$collection->get(5)->insertAfter($someElement)

順序が重要です。私はAPIを見て、適切な方法を見つけることができませんでした。私がやっていることは、基本的にはコメントシステムです。私はその直後に他のコメントに返信しているコメントを追加しようとしています。

これは実行可能ですか?私はLaravel 4.2を使用しています。私はまたスプライスやマージをたくさんすることを検討していますが、それは実際にはパフォーマンスが重視されるようです。

提案がありますか?ありがとう。

+0

順序はあなたが 'sortBy'メソッドを使用していない理由のために敏感である場合は? – huuuk

+0

コメント表に 'parent_id'を追加するので、コメントに返信して最初のコメントの子として設定したり、このパッケージを見ることができます:[baum](https://github.com/etrepat/baum)&[laravel-nestedset](https://github.com/lazychaser/laravel-nestedset/) – Rifki

答えて

3

->splice()を使用できます。
コードは次のようになります。 $collection->splice(5, 0, [$someElement]);
これは、$someElementを6番目に挿入します。


Laravel 5.2バージョン

あなたがid == 5と右の要素の後に要素を挿入する必要がある場合は、あなたがその要素を検索し、新しい要素を挿入することが分かったインデックスを使用する必要があります。

$index = $collection->search(function ($item, $key) { 
     return $item->id == 5; 
    }); 
    $collection->splice($index, 0, [$someElement]); 

Laravel 4.2バージョン

残念ながらLaravel 4.2は、クロージャとして検索パラメータを受け付けませんので、我々は、手動でインデックスを見つける必要があり:

$foundKey = null; 
    foreach ($collection->all() as $key => $item) { 
     if ($item->id == 5) { 
      $foundKey = $key; 
      break; 
     } 
    } 
    if($foundKey !== null) 
    { 
     $collection->splice($index, 0, [$someElement]); 
    } 
+0

うーん、私はこれをやろうとしましたが、$ indexは常にfalseになりました。私がしたときでも: ' $ index = $ collection-> search(function($ item、$ key){ return true; }); ' 私は何か他のことをやってしまいました。私はコレクションをforeachしてから、各要素のHTML文字列を生成し、それを文字列変数に追加します。しかし、助けてくれてありがとう。たぶん私はLaravel 4.2を使っているので、$ collection-> search()はうまくいきませんでしたか? –

+1

@PhilYu Unfotunately私はあなたがL4.2を使用していることに気付かなかった。そして、はい、L4.2の検索はちょっと違っています。クロージャは受け入れられません.L4.2検索(https://github.com/laravel/framework/blob/4.2/src/Illuminate/Support /Collection.php#L480)、[L5.2検索](https://github.com/laravel/framework/blob/5.2/src/Illuminate/Support/Collection.php#L741) –

関連する問題