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

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

思路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解决嵌套问题内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!