如何在获取之后取消设置(删除)集合元素?

时间:2016-06-02 09:56:39

标签: laravel collections

我有一个集合,我想在我获取它的一些元素时进行迭代和修改。但我找不到删除该元素的方法或方法。

$selected = []; 
foreach ($collection as $key => $value) {
      if ($collection->selected == true) {
          $selected[] = $value;
          unset($value);
      }
}

这只是我演示问题的一种表现形式。

在@Ohgodwhy推荐了forget()函数后,我再次检查它,发现我实际上误解了这个函数。这正是我在寻找的。在我在if语句中添加“$ collection-> forget($ key)”之后,就像下面的演示一样,它有效。

$selected = []; 
foreach ($collection as $key => $value) {
      if ($collection->selected == true) {
          $selected[] = $value;
          $collection->forget($key);
      }
}

(这只是一个示范)

5 个答案:

答案 0 :(得分:71)

您可能希望使用->forget()

$collection->forget($key);

链接到forget method documentation

答案 1 :(得分:14)

或者您可以使用reject method

$newColection = $collection->reject(function($element) {
    return $item->selected != true;
});

pull method

$selected = []; 
foreach ($collection as $key => $item) {
      if ($item->selected == true) {
          $selected[] = $collection->pull($key);
      }
}

答案 2 :(得分:2)

Laravel Collection实现了PHP ArrayAccess接口(这就是为什么可以首先使用foreach的原因。)

如果您已经拥有密钥,则可以只使用PHP unset

我稍微喜欢这个,因为它可以明显地修改集合。

foreach ($collection as $key => $value) {
    unset($collection[$key]);
}

答案 3 :(得分:0)

  

如果您知道未设置的密钥,请直接用逗号输入   分开

    if (this.lastCall) clearTimeout(this.lastCall);
    this.lastCall = setTimeout(........);

答案 4 :(得分:0)

我假设$collection->selected的意思是$value->selected,然后我将重构完整的代码,如下所示:

/**
 * Filter all `selected` items
 *
 * @link https://laravel.com/docs/5.8/collections#method-filter
 */
$selected = $collection->filter(function($value, $key) {
    return $value->selected;
})->toArray();