【问题标题】:How can I delete a column in a multi-dimensional Laravel collection?如何删除多维 Laravel 集合中的列?
【发布时间】: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 一起使用,但是我缺少一个简单的衬里吗? 这似乎很常见。

【问题讨论】:

  • 避免使用“最简单的方式”、“最好的方式”等来写你的问题,否则你会被否决

标签: laravel collections eloquent


【解决方案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.*

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-17
          • 2011-06-26
          • 2018-11-21
          • 2022-10-04
          • 1970-01-01
          • 1970-01-01
          • 2017-04-06
          相关资源
          最近更新 更多