PHP优化教程之解决嵌套问题

admin3年前PHP教程128

在开发过程中,我们经常遇到一对多的场景,

例如:查询订单列表,并且展示订单详情商品、数量数据

思路0:传统做法

a. 查询订单列表

b. 遍历订单详情


$orderList = select * from order where xx;
foreach($orderList as $orderItem) {
    $orderItem->detailList = select * from order_detail where order_id = $orderItem->id;
}

 分析:查询SQL次数为:N+1(N为订单个数),这样频繁请求数据库,影响效率

 优化:减少频繁请求数据库

思路1:

a. 查询订单列表后,利用in查出所有订单详情

b. 通过(订单表id => 订单详情表order_id)遍历匹配数据


$orderList = select * from order where xx;
$orderId = array_pluck($orderList, 'id'); // Laravel内置数组辅助函数
$orderDetailList = select * from order_detail where order_id IN $orderId;
foreach($orderList as $orderItem) {
    $detailListTemp = [];
    foreach($orderDetailList as $orderDetailItem) {
        if ($orderItem->id == $orderDetailItem->order_id) {
            $detailListTemp[] = $orderDetailItem;      
        }
    }
    $orderItem->detailList = $detailListTemp;
}

 分析:降低查询后,但2层遍历,复杂度较高,数量过大容易内存溢出

 优化:降低复杂度

思路2:

a. 查询订单列表后,利用in查出所有订单详情

b. 订单详情列表转换成以订单ID为索引,用isset来匹配订单的详情


$orderList = select * from order where xx;
$orderId = array_pluck($orderList, 'id'); // Laravel内置数组辅助函数
$orderDetailList = select * from order_detail where order_id IN $orderId;
 
// 将订单详情转换成以订单ID为索引【方式1】
$orderDetailList = arrayGroup($orderDetailList, 'order_id');
// 或:将订单详情转换成以订单ID为索引【方式2:如果为一对一,可以用array_column】
// $orderList = array_column($orderDetailList, null, 'order_id');
 
foreach($orderList as $orderItem) {
    $orderItem->detailList = $orderDetailList[$orderItem->id] ?? [];
}
 
// 根据KEY数组分组
function arrayGroup($list, $key) {
 $newList = [];
 foreach ($list as $item) {
  $newList[$item[$key]][] = $item;
 }
 return $newList;
}

总结

到此这篇关于PHP优化教程之解决嵌套问题的文章就介绍到这了,更多相关PHP解决嵌套问题内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

PHP的重载使用魔术方法代码实例详解

摘录PHP官网对PHP重载的解释:PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magic methods...

php中laravel调度执行错误解决方法

我们说laravel框架的功能性比较明确,作为全栈框架在代码的运行上是比较简洁的。在对laravel框架安装完成后,我们可以就其中的一些操作为大家展现。本篇要带来的是在laravel中的调度,分为两种...

江苏高防服务器的性能特点

江苏高防服务器的性能特点?江苏高防服务器是指具有高防御性能的服务器,通常可提供针对各种网络攻击的有效保护。具体而言,江苏高防服务器的性能特点可能包括:1.高性能处理器和大内存:江苏高防服务器通常采用高...

杭州BGP高防服务器租用优势有哪些

杭州BGP高防服务器租用的优势包括:高防能力强:BGP高防服务器采用了BGP路由协议和多线接入技术,能够有效地抵御各种DDoS攻击和黑客入侵,确保您的网站和服务器的安全和稳定运行。带宽大:BGP高防服...

企业为什么要选择租用宁波高防服务器来防御ddos攻击

企业为什么要选择租用宁波高防服务器来防御ddos攻击?企业选择租用宁波高防服务器来防御DDoS攻击的原因有以下几点:高防服务器具有强大的防御能力:高防服务器可以通过多种方式,如流量清洗、黑白名单过滤、...

PHP设计模式(观察者模式)

PHP 设计模式之观察者模式介绍现在有两派,有的人建议使用设计模式,有的人不建议使用设计模式! 这就向写文章一样,有的人喜欢文章按照套路走,比如叙事性质的文章,时间,地点,人物,事件。而有的人喜欢写杂...