Php 高效地将查询转换为预期数组-Laravel
我有一个Php 高效地将查询转换为预期数组-Laravel,php,arrays,laravel,eloquent,Php,Arrays,Laravel,Eloquent,我有一个字典表,如下所示: 下面是我想要的数组结果: 我已经通过这些丑陋的代码获得了结果: $dictionaries = Dictionary::all(); $carriers_array = []; $carriers = $dictionaries->unique('Carrier'); foreach($carriers as $carrier) { $carriers_array[] = $carrier->Carrie
字典
表,如下所示:
下面是我想要的数组结果:
我已经通过这些丑陋的代码获得了结果:
$dictionaries = Dictionary::all();
$carriers_array = [];
$carriers = $dictionaries->unique('Carrier');
foreach($carriers as $carrier) {
$carriers_array[] = $carrier->Carrier;
}
$DOM_INLs_array = [];
foreach($carriers_array as $carrier_item) {
$DOM_INLs = $dictionaries->where('Carrier', $carrier_item)->unique('DOM_INL');
foreach($DOM_INLs as $DOM_INL) {
$DOM_INLs_array[$carrier_item][] = $DOM_INL->DOM_INL;
}
}
$groups_array = [];
foreach($DOM_INLs_array as $carrier => $DOM_INLs) {
foreach($DOM_INLs as $DOM_INL) {
$groups = $dictionaries->where('Carrier', $carrier)->where('DOM_INL', $DOM_INL)->unique('Group');
foreach($groups as $group) {
$groups_array[$carrier][$DOM_INL][] = $group->Group;
}
}
}
$routes_array = [];
foreach($groups_array as $carrier => $DOM_INLs) {
foreach($DOM_INLs as $DOM_INL => $groups) {
foreach($groups as $group) {
$routes = $dictionaries->where('Carrier', $carrier)->where('DOM_INL', $DOM_INL)->where('Group', $group)->unique('Route');
foreach($routes as $route) {
$routes_array[$carrier][$DOM_INL][$group][] = $route->Route;
}
}
}
}
$sectors_array = [];
foreach($routes_array as $carrier => $DOM_INLs) {
foreach($DOM_INLs as $DOM_INL => $groups) {
foreach($groups as $group => $routes) {
foreach($routes as $route) {
$sectors = $dictionaries->where('Carrier', $carrier)->where('DOM_INL', $DOM_INL)->where('Group', $group)->where('Route', $route)->unique('Sector');
foreach($sectors as $sector) {
$sectors_array[$carrier][$DOM_INL][$group][$route][] = $sector->Sector;
}
}
}
}
}
dd($sectors_array);
但是它运行得很慢,我想用另一种方法来获得同样的结果,但效率更高。有人能帮忙吗?这看起来像是一堆嵌套的
map
s和groupBy
s,末尾有一个pull
:
箭头函数,PHP7.4+:
$dictionaries->groupBy('Carrier')
->map(fn ($i) => $i->groupBy('DOM_INL')
->map(fn ($i) => $i->groupBy('Group')
->map(fn ($i) => $i->groupBy('Route')
->map->pluck('Sector')
)
)
);
使用匿名功能:
$dictionaries->groupBy('Carrier')->map(function ($i) {
return $i->groupBy('DOM_INL')->map(function ($i) {
return $i->groupBy('Group')->map(function ($i) {
return $i->groupBy('Route')->map->pluck('Sector');
});
});
});
如果您只需要以这种方式对这些结果进行分组,而不需要将叶子仅仅作为“扇区”值,那么这将是对groupBy
的一次调用:
$dictionary->groupBy(['Carrier', 'DOM_INL', 'Group', 'Route'])
请编辑您的问题并包括您的查询。@AhmadKarimi我更新了问题,其中包括对
$dictionaries
的查询您的解决方案看起来很有希望,但这些代码看起来像新版本的php,可以给我与旧版本的php兼容的代码吗?当然,检查更新,看看这是否适用于你我只是有另一个问题。也就是说,要获得当前结果,我必须查询整个表并将所有结果加载到内存中。如果这个表只有10000行,我就不会有问题了。但是,如果表有100000行、200000行或更多行。。。每个查询将占用1GB或更多内存,导致服务器死亡。我正在使用的VPS只有2GB内存。。。您是否有办法帮助我解决内存使用问题,并且仍然获得与现在相同的结果?