Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 高效地将查询转换为预期数组-Laravel_Php_Arrays_Laravel_Eloquent - Fatal编程技术网

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内存。。。您是否有办法帮助我解决内存使用问题,并且仍然获得与现在相同的结果?