PHP优化教程之解决嵌套问题
发布:smiling 来源: PHP粉丝网 添加日期:2022-04-11 16:05:38 浏览: 评论:0
在开发过程中,我们经常遇到一对多的场景,
例如:查询订单列表,并且展示订单详情商品、数量数据
思路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;
- }
Tags: PHP优化教程 PHP嵌套
- 上一篇:PHP超级全局变量、魔术变量和魔术函数汇总整理
- 下一篇:最后一页
相关文章
- ·PHP嵌套输出缓存的例子(2015-04-13)
- ·PHP基础之异常处理1——简单异常处理及嵌套异常(2021-01-02)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)