如何在 Laravel 集合中的具有指定键的元素之后插入元素?

问题描述 投票:0回答:2

我希望在具有特定键的另一个元素之后将一个元素插入 Laravel 集合中。比如:

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

顺序很重要,因为我稍后将在视图中使用它输出 HTML。我翻遍了API,没有找到合适的方法。我正在做的基本上是一个评论系统,我正在尝试添加随后回复其他评论的评论。

这可行吗?我正在使用 Laravel 4.2。我也在考虑进行大量的拼接和合并,但这似乎在性能方面确实很糟糕。

有什么建议吗?谢谢。

php laravel collections laravel-4
2个回答
4
投票

您可以使用

->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]);
    }

0
投票

这是使用

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"
]
© www.soinside.com 2019 - 2024. All rights reserved.