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

Posted

技术标签:

【中文标题】获取后如何取消设置(删除)集合元素?【英文标题】:How to unset (remove) a collection element after fetching it? 【发布时间】:2016-10-01 23:50:34 【问题描述】:

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

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

这只是我的问题的演示。

在@Ohgodwhy 建议forget() 函数后,我再次检查它,发现我实际上误解了该函数。这正是我正在寻找的。

所以对于可行的解决方案,我在 if 语句中添加了 $collection->forget($key)

以下是我的问题的有效解决方案,使用@Ohgodwhy 的解决方案:

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

(这只是一个演示)

【问题讨论】:

我建议不要将您的项目存储在数组中,而是创建一个新集合并通过推送将元素添加到其中。 @Amarnasan 该怎么做?我现在不需要它,但我想我将来可能需要它 看看这里:***.com/a/58769554/655224。你的if 条件$collection->selected == true 没有意义。为什么要检查collection 对象的属性selected 而不是value?如果该属性确实在 collection 内,请在循环之外检查一次。 【参考方案1】:

你会想使用->forget()

$collection->forget($key);

链接到forget method documentation

【讨论】:

是的,实际上我误解了忘记()。我认为 $key 参数会删除所有给定的键。现在我可以通过 if 语句在循环中使用它了。 forget()delete()remove() 相比很酷,但是我不得不来这里了解如何删除项目 :) 如果要删除整个对象怎么办? @Adamnick 对于forget,您需要知道数组中对象的index。你想要的大概是filter() 对于现在正在查看此内容的任何人,原始问题中的链接已损坏,但您可以在此处找到相同的文档 laravel.com/docs/5.8/collections#method-forget【参考方案2】:

或者你可以使用rejectmethod

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

pullmethod

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

【讨论】:

但是拒绝解决方案不会从原始集合中删除元素,对吧? 是的,它保持原始收藏完好 那么这个问题的完美解决方案就是第二个。 $collection = $collection->reject(...) 将用新集合覆盖原始集合。而$collection->pull(...) 是我认为的最佳解决方案。主题标题包含...after fetching it...。这就是pull 所做的。【参考方案3】:

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

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

我更喜欢这个,因为它清楚地修改了集合,并且易于记忆。

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

【讨论】:

【参考方案4】:

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

另见此处:https://***.com/a/2304578/655224 并在评论中提供给定链接http://php.net/manual/en/control-structures.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();

【讨论】:

【参考方案5】:

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

unset($attr['placeholder'], $attr['autocomplete']);

【讨论】:

我遇到了一个特殊情况,我有一个项目列表系统,其中一个新的属性被返回到最新的属性集合和未评级的集合中,我都显示在一个页面上。我希望已经在第一个列表中的那些项目从第二个列表中弹出我该怎么做。请记住,您无法确定该项目将出现的索引。我可以做类似$collection->forget($item->id) 的事情吗?【参考方案6】:

您可以使用收集的方法,如pullforgetreject

但是每个 Collection 方法都会返回一个全新的 Collection 实例。

文档链接:https://laravel.com/docs/8.x/collections#introduction

【讨论】:

以上是关于获取后如何取消设置(删除)集合元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHP 数组中取消设置数字索引元素?

创建和删除DOM元素

java如何获得集合里面某个元素的下标

如何删除一个list中最后一个元素

数组如何一边遍历一边删除元素

如何利用JavaScript语言获取Map集合中元素个数