列举一下,日常业务中,我们会有订单表,订单商品表。
现在有这么一个需求,在订单表的数据中,追加订单商品表数据
条件就是:$order 的id 是和 $orderGoods的 order_id 一样的,他们是通过这个字段来做关联的
代码如下:
$order = [
['id' => 1, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 2, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 3, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 4, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 5, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 6, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 7, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 8, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
];
$orderGoods = [
['id' => 1, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 2, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 3, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 4, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 5, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 6, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 7, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 8, 'order_id' => 3, 'goods_name' => '商品名字'],
['id' => 9, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 10, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 11, 'order_id' => 3, 'goods_name' => '商品名字'],
['id' => 12, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 13, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 14, 'order_id' => 1, 'goods_name' => '商品名字'],
];
$e = 0;
foreach ($order as $k => $v) {
foreach ($orderGoods as $ks => $vs) {
$e += 1;
if ($v['id'] == $vs['order_id']) {
$order[$k]['order_goods'][] = $vs;
}
}
}
echo '总的循环数:'.$e;// 112
echo "<br>";
dd($order);
结果:
总的循环数:112
<br>array(8) {
[0]=>
array(5) {
["id"]=>
int(1)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
["order_goods"]=>
array(8) {
[0]=>
array(3) {
["id"]=>
int(1)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[1]=>
array(3) {
["id"]=>
int(2)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[2]=>
array(3) {
["id"]=>
int(3)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[3]=>
array(3) {
["id"]=>
int(4)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[4]=>
array(3) {
["id"]=>
int(5)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[5]=>
array(3) {
["id"]=>
int(6)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[6]=>
array(3) {
["id"]=>
int(13)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[7]=>
array(3) {
["id"]=>
int(14)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
}
}
[1]=>
array(5) {
["id"]=>
int(2)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
["order_goods"]=>
array(4) {
[0]=>
array(3) {
["id"]=>
int(7)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
[1]=>
array(3) {
["id"]=>
int(9)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
[2]=>
array(3) {
["id"]=>
int(10)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
[3]=>
array(3) {
["id"]=>
int(12)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
}
}
[2]=>
array(5) {
["id"]=>
int(3)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
["order_goods"]=>
array(2) {
[0]=>
array(3) {
["id"]=>
int(8)
["order_id"]=>
int(3)
["goods_name"]=>
string(12) "商品名字"
}
[1]=>
array(3) {
["id"]=>
int(11)
["order_id"]=>
int(3)
["goods_name"]=>
string(12) "商品名字"
}
}
}
[3]=>
array(4) {
["id"]=>
int(4)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[4]=>
array(4) {
["id"]=>
int(5)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[5]=>
array(4) {
["id"]=>
int(6)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[6]=>
array(4) {
["id"]=>
int(7)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[7]=>
array(4) {
["id"]=>
int(8)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
}
通过循环 订单表的数据,再循环订单商品表数据,是不是很轻松就实现了功能
但是会存在一个问题哦,每次都要通过订单数据,再重新循环一遍订单商品表,时间复杂就是 O(logn)
可以看到 echo $e;的时候,是112,也就是说,他总共循环了112次
那么要怎么对他进行优化,减少 foreach 嵌套呢?
下面就是我的代码
$order = [
['id' => 1, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 2, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 3, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 4, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 5, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 6, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 7, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
['id' => 8, 'status' => 1, 'order_dsn' => '订单号', 'time' => '下单时间'],
];
$orderGoods = [
['id' => 1, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 2, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 3, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 4, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 5, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 6, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 7, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 8, 'order_id' => 3, 'goods_name' => '商品名字'],
['id' => 9, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 10, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 11, 'order_id' => 3, 'goods_name' => '商品名字'],
['id' => 12, 'order_id' => 2, 'goods_name' => '商品名字'],
['id' => 13, 'order_id' => 1, 'goods_name' => '商品名字'],
['id' => 14, 'order_id' => 1, 'goods_name' => '商品名字'],
];
$i = 0;
foreach ($order as $k => $v) {
$i += 1;
$new[$v['id']] = $v;
}
echo '订单数据循环数:'.$i;// 8
$j = 0;
foreach ($orderGoods as $k => $v) {
$j += 1;
if (isset($new[$v['order_id']])) {
$new[$v['order_id']]['order_goods'][] = $v;
}
}
echo '订单商品数据循环数:'.$j.'总的循环数:';
echo $j + $i;// 22
echo "<br>";
dd($new);
exit;
输出结果如下:订单数据循环数:8订单商品数据循环数:14总的循环数:22
订单数据循环数:8订单商品数据循环数:14总的循环数:22
<br>array(8) {
[1]=>
array(5) {
["id"]=>
int(1)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
["order_goods"]=>
array(8) {
[0]=>
array(3) {
["id"]=>
int(1)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[1]=>
array(3) {
["id"]=>
int(2)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[2]=>
array(3) {
["id"]=>
int(3)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[3]=>
array(3) {
["id"]=>
int(4)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[4]=>
array(3) {
["id"]=>
int(5)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[5]=>
array(3) {
["id"]=>
int(6)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[6]=>
array(3) {
["id"]=>
int(13)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
[7]=>
array(3) {
["id"]=>
int(14)
["order_id"]=>
int(1)
["goods_name"]=>
string(12) "商品名字"
}
}
}
[2]=>
array(5) {
["id"]=>
int(2)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
["order_goods"]=>
array(4) {
[0]=>
array(3) {
["id"]=>
int(7)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
[1]=>
array(3) {
["id"]=>
int(9)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
[2]=>
array(3) {
["id"]=>
int(10)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
[3]=>
array(3) {
["id"]=>
int(12)
["order_id"]=>
int(2)
["goods_name"]=>
string(12) "商品名字"
}
}
}
[3]=>
array(5) {
["id"]=>
int(3)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
["order_goods"]=>
array(2) {
[0]=>
array(3) {
["id"]=>
int(8)
["order_id"]=>
int(3)
["goods_name"]=>
string(12) "商品名字"
}
[1]=>
array(3) {
["id"]=>
int(11)
["order_id"]=>
int(3)
["goods_name"]=>
string(12) "商品名字"
}
}
}
[4]=>
array(4) {
["id"]=>
int(4)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[5]=>
array(4) {
["id"]=>
int(5)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[6]=>
array(4) {
["id"]=>
int(6)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[7]=>
array(4) {
["id"]=>
int(7)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
[8]=>
array(4) {
["id"]=>
int(8)
["status"]=>
int(1)
["order_dsn"]=>
string(9) "订单号"
["time"]=>
string(12) "下单时间"
}
}
是不是减少了很多循环次数?
如果是更大的数据量呢?或者也有类似的场景,可以通过这个方法优化一下