列舉一下,日常業務中,我們會有訂單表,訂單商品表。
現在有這麼一個需求,在訂單表的數據中,追加訂單商品表數據
條件就是:$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) "下單時間"
}
}
是不是減少了很多循環次數?
如果是更大的數據量呢?或者也有類似的場景,可以通過這個方法優化一下