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

Ske*_*tor 53 collections laravel

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

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

这只是我演示问题的一个表示.

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

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

(这只是一个演示)

Ohg*_*why 86

你会想要使用 ->forget()

$collection->forget($key);
Run Code Online (Sandbox Code Playgroud)

链接到忘记方法文档

  • `forget()`与`delete()`或`remove()`相比很酷,但是地狱,我不得不来这里找出如何删除项目:) (11认同)
  • @Adamnick使用`forget`,您需要知道数组中对象的`index`。您想要的可能是`filter()`。 (3认同)

huu*_*uuk 18

或者你可以使用reject 方法

$newColection = $collection->reject(function($element) {
    return $item->selected != true;
});
Run Code Online (Sandbox Code Playgroud)

pull 方法

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

  • 但是拒绝解决方案不会从原始集合中删除元素,对吗? (2认同)

alg*_*thm 12

我不喜欢迭代集合并在循环内操作甚至该集合的内容的解决方案。这可能会导致意外的行为。

另请参阅此处: https: //stackoverflow.com/a/2304578/655224以及评论中给定的链接http://php.net/manual/en/control-structs.foreach.php#88578

因此,使用时foreach似乎没问题,但恕我直言,更具可读性和简单的解决方案是将您的集合过滤为新的集合。

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


and*_*ber 7

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

如果已经有了密钥,则可以使用PHP unset

我更喜欢这样做,因为它可以明显地修改集合,并且易于记忆。

foreach ($collection as $key => $value) {
    unset($collection[$key]);
}
Run Code Online (Sandbox Code Playgroud)