避免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) "下单时间"
  }
}

 

是不是减少了很多循环次数?

如果是更大的数据量呢?或者也有类似的场景,可以通过这个方法优化一下

 

 

 

 

 

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