避免foreach嵌套foreach的方法

列舉一下,日常業務中,我們會有訂單表,訂單商品表。

現在有這麼一個需求,在訂單表的數據中,追加訂單商品表數據

條件就是:$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) "下單時間"
  }
}

 

是不是減少了很多循環次數?

如果是更大的數據量呢?或者也有類似的場景,可以通過這個方法優化一下

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章