如何删除多维 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 集合中的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Destroy 函数中删除具有多个参数的数据 - Laravel

如何删除 C++ 给定矩阵中的特定行和列?

如何删除多维字符串数组中的空元素?

如何在laravel背包中启用软删除

如何从 PHP 中的多维数组中删除重复值

如何从 PHP 中的多维关联数组中删除项目