如何删除多维 Laravel 集合中的列?
Posted
技术标签:
【中文标题】如何删除多维 Laravel 集合中的列?【英文标题】:How can I delete a column in a multi-dimensional Laravel collection? 【发布时间】:2018-07-19 08:05:39 【问题描述】:我只想从多维集合中删除一列。
$z = collect(
["x"=>"a", "y"=>"b", "z"=>"c"],
["x"=>"c", "y"=>"d", "z"=>"e"]
);
$z->deleteColumn("x");
$z 现在应该有数据集了:
[
["y"=>b", "z"=> "c"]
["y"=>d", "z"=> "e"]
]
我可以将地图功能与 except 一起使用,但是我缺少一个简单的衬里吗? 这似乎很常见。
【问题讨论】:
避免使用“最简单的方式”、“最好的方式”等来写你的问题,否则你会被否决 【参考方案1】:使用transform()
方法:
$collection->transform(function($i)
unset($i->x);
return $i;
);
【讨论】:
【参考方案2】:最好设置需要的,而不是删除不需要的。您将拥有易于扩展和修改的代码。
将transform()
方法与only()
一起使用:
$collection->transform(function($item)
return $item->only(['y', 'z']);
);
【讨论】:
【参考方案3】:我迟到了,但也可以通过以下方式完成:
$collection->transform(function(array $item)
return Arr::except($item, 'x');
);
【讨论】:
【参考方案4】:你可以使用 Laravel pluck 方法,像这样:
$z = collect([
["x"=>"a", "y"=>"b"],
["x"=>"c", "y"=>"d"]
);
$z = $z->pluck('y');
//["b", "d"]
【讨论】:
这在技术上是正确的,但是我基本上想要 pluck 的相反。 Pluck 从集合中返回一组列。我想从集合中删除一组列并返回那些未删除的列。 那么你应该选择@sapnesh-naik 答案作为正确答案,因为忘记方法做了你刚才解释的事情 我无法使forget
方法从多维集合中删除一列。它似乎只是从一维集合中删除键。
然后您可以尝试@AlexeyMezenin 解决方案,它不是单一的,但它可以完成工作【参考方案5】:
我最终为 Collection 类编写了一个宏。
/**
* Pass array or string of key column names to remove
*/
Collection::macro('removeCols', function ($except)
if (!is_array($except)) $except = (array)$except;
// Single Dimensional arrays
if (!is_array($this->first()) && !is_object($this->first())) return $this->except($except);
// Multi Dimensional arrays
$out = $this->map(function ($item) use ($except)
$item = collect($item);
return $item->except($except)->toArray();
);
return collect($out);
);
【讨论】:
感谢分享。你会想要优化它,因为它看起来像代码消耗内存。例如,不要将每个项目转换为集合,而是进行操作并将其转换为数组,只需在原始数组上使用array_except()
即可。
感谢您的指导!【参考方案6】:
$syncData = $z->map(function($attr)
return Arr::only($attr, ['y', 'z']);
);
Laravel 8.*
【讨论】:
以上是关于如何删除多维 Laravel 集合中的列?的主要内容,如果未能解决你的问题,请参考以下文章