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

 更新时间:2021年02月06日 14:58:11   作者:cc_echo  
这篇文章主要给大家介绍了关于PHP优化教程之解决嵌套问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

思路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核心特性命名空间

    在命名空间提出之前,不同的组件很容易碰到命名的冲突,例如Request、Response等常见的命名。本文将带你理解PHP的核心特性命名空间。
    2021-05-05
  • Cakephp 执行主要流程

    Cakephp 执行主要流程

    Cakephp执行主要流程,学习cakephp的朋友可以参考下。
    2010-03-03
  • php导出CSV抽象类实例

    php导出CSV抽象类实例

    这篇文章主要介绍了php导出CSV抽象类及其用法示例,可实现循环导出功能,从而避免内存不足的问题,需要的朋友可以参考下
    2014-09-09
  • PHP获取某个月最大天数(最后一天)的方法

    PHP获取某个月最大天数(最后一天)的方法

    这篇文章主要介绍了PHP获取某个月最大天数(最后一天)的方法,涉及php流程控制及数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • php5 pdo新改动加载注意事项

    php5 pdo新改动加载注意事项

    想试试pdo怎么用,把 extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll
    2008-09-09
  • php求今天、昨天、明天时间戳的简单实现方法

    php求今天、昨天、明天时间戳的简单实现方法

    这篇文章主要介绍了php求今天、昨天、明天时间戳的方法,实例分析了strtotime函数的常见使用技巧,非常简单实用,需要的朋友可以参考下
    2016-07-07
  • PHP高效处理前端数据过滤二维数组并存入数据库

    PHP高效处理前端数据过滤二维数组并存入数据库

    这篇文章主要介绍了PHP高效处理前端数据过滤二维数组并存入数据库,通过从二维数组获取指定数据,组成新二维数组实现过程示例来为大家讲解
    2023-10-10
  • PHP实现文件上传和多文件上传

    PHP实现文件上传和多文件上传

    这篇文章主要介绍了PHP实现文件上传和多文件上传的相关资料,还为大家分享了解决如何修改PHP上传文件的大小限制问题的方法,需要的朋友可以参考下
    2015-12-12
  • PHP自带方法验证邮箱是否存在

    PHP自带方法验证邮箱是否存在

    这篇文章主要为大家详细介绍了PHP自带方法验证邮箱是否存在,以及PHP自带方法验证URL、IP是否合法,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • php实现简单四则运算器

    php实现简单四则运算器

    这篇文章主要为大家详细介绍了php实现简单四则运算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论