我希望在具有特定键的另一个元素之后将一个元素插入 Laravel 集合中。比如:
$collection->get(5)->insertAfter($someElement)
顺序很重要,因为我稍后将在视图中使用它输出 HTML。我翻遍了API,没有找到合适的方法。我正在做的基本上是一个评论系统,我正在尝试添加随后回复其他评论的评论。
这可行吗?我正在使用 Laravel 4.2。我也在考虑进行大量的拼接和合并,但这似乎在性能方面确实很糟糕。
有什么建议吗?谢谢。
您可以使用
->splice()
。$collection->splice(5, 0, [$someElement]);
$someElement
插入第六位。
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]);
}
这是使用
macro
将自定义 addAfter()
方法添加到 Collection 类的解决方案:
use Illuminate\Support\Collection;
Collection::macro('addAfter', function ($afterKey, $newItem) {
/** @var Collection $this */
$index = $this->keys()->search($afterKey) ?: $this->count() - 1;
return $this->slice(0, $index + 1)
->merge($newItem)
->merge($this->slice($index + 1));
});
如果未找到指定的 $afterKey,该项目将被插入到集合的末尾。
用途:
$collection = collect([
'item1' => 'value1',
'item2' => 'value2',
'item3' => 'value3',
]);
$newCollection = $collection->addAfter('item2', [ 'newItem' => 'newValue' ]);
dd($newCollection);
结果:
[▼
"item1" => "value1"
"item2" => "value2"
"newItem" => "newValue"
"item3" => "value3"
]