在 laravel 中旋转集合

问题描述 投票:0回答:2

我不确定“旋转”是否是编程词中解释我需要的最好的词,但我会尝试。

我有这个收藏:

^ Illuminate\Support\Collection {#2341 ▼
  #items: array:187 [▼
    1 => Illuminate\Support\Collection {#1506 ▼
      #items: array:4 [▼
        0 => "ulbPln_idPrd"
        1 => "Decimal"
        2 => "<No value>"
        3 => "<No value>"
      ]
      #escapeWhenCastingToString: false
    }
    2 => Illuminate\Support\Collection {#2280 ▼
      #items: array:4 [▼
        0 => "idCanDiag"
        1 => "Decimal"
        2 => "<No value>"
        3 => "<No value>"
      ]
      #escapeWhenCastingToString: false
    }

如您所见,这是一个 187 个元素的集合,每行有 4 个项目。

我需要的是“旋转”集合并获得 4 个包含 187 个项目的数组

    ^ Illuminate\Support\Collection {#2341 ▼
  #items: array:4 [▼
    1 => Illuminate\Support\Collection {#1506 ▼
      #items: array:187 [▼
        0 => "ulbPln_idPrd"
        1 => "idCanDiag"
      ...
      ]
      #escapeWhenCastingToString: false
    }
    2 => Illuminate\Support\Collection {#2280 ▼
      #items: array:4 [▼
        0 => "Decimal"
        1 => "Decimal"
      ...
      ]
      #escapeWhenCastingToString: false
    }

我问这个,因为几个月前我在 laravel 文档中读到了一些关于 helper 的内容来执行此操作,但现在我找不到它。

php laravel
2个回答
0
投票

你想要的是转置矩阵。

这可以轻松完成,感谢

data_set
data_get
助手

基本上,我们想要

$A = collect([
    ['a', 'b', 'c'],
    ['d', 'e', 'f']
]);

成为

$B = collect([
    ['a', 'd'],
    ['b', 'e'],
    ['c', 'f']
]);

这应该有效。

$B = [];
for ($i = 0; $i < count($A->first()); $i++)
    for ($j = 0; $j < $A->count(); $j++)
        data_set($B, "$i.$j", data_get($A, "$j.$i"));

$B = collect($B);

限制如下:

  1. 没有关联数组。
  2. 假设每一行都有相同数量的元素。

这很简单,您可以将其设为

Collection
宏。

# AppServiceProvider class
use Illuminate\Support\Collection;

public function boot()
{
    Collection::macro('transpose', function () {
        // maybe add some error checking
        $new = [];
        for ($i = 0; $i < count($this->first()); $i++)
            for ($j = 0; $j < $this->count(); $j++)
                data_set($new, "$i.$j", data_get($this, "$j.$i"));

        return collect($new);
    });
}

然后你可以在其他地方自由调用它。

$transposed = $yourCollection->transpose();

0
投票

您可以通过 Laravel 的 Spatie Collection Macros Package 找到这个确切的功能(以及更多)。

特别是

转置宏,您可以通过它找到测试,以帮助建立代码工作的信心。

我没有 Spatie 的链接,但我在我维护的项目中经常使用这个转换宏。

© www.soinside.com 2019 - 2024. All rights reserved.