我不确定“旋转”是否是编程词中解释我需要的最好的词,但我会尝试。
我有这个收藏:
^ 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 的内容来执行此操作,但现在我找不到它。
你想要的是转置矩阵。
这可以轻松完成,感谢
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);
限制如下:
这很简单,您可以将其设为
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();
您可以通过 Laravel 的 Spatie Collection Macros Package 找到这个确切的功能(以及更多)。
特别是我没有 Spatie 的链接,但我在我维护的项目中经常使用这个转换宏。