分组php数组的最佳方法是什么?

时间:2020-08-18 13:30:09

标签: php arrays

例如,我有这个数组:

$bills = array(
                 array("bill_id"=>"1", "product_id"=>"1", "total"=>"10"),
                 array("bill_id"=>"2", "product_id"=>"2", "total"=>"20"),
                 array("bill_id"=>"3", "product_id"=>"1", "total"=>"30"),
                 array("bill_id"=>"4", "product_id"=>"1", "total"=>"40"),
                 array("bill_id"=>"5", "product_id"=>"2", "total"=>"50")
            );

我们需要将每个产品的总数添加到单个数组中,即从上述数组中生成以下数组的最佳快速清理方法是什么:

 $products = array(
                array("product_id"=>"1", "total"=>"80"),
                array("product_id"=>"2", "total"=>"70")
            );

2 个答案:

答案 0 :(得分:2)

最快的方法是索引数组,类似这样的

$products = array();

foreach ($bills as $bill) {
    $key = $bill['product_id'];
    if (isset($products[$key])) {
        $products[$key]['total'] += $bill['total'];
    } else {
        $products[$key] = $bill;
    }
}

var_dump($products);

输出

array(2) {
  [1]=>
  array(3) {
    ["bill_id"]=>
    string(1) "1"
    ["product_id"]=>
    string(1) "1"
    ["total"]=>
    int(80)
  }
  [2]=>
  array(3) {
    ["bill_id"]=>
    string(1) "2"
    ["product_id"]=>
    string(1) "2"
    ["total"]=>
    int(70)
  }
}

浏览发票清单

foreach($products as $key=>$bill) {
    var_dump($bill);
}

答案 1 :(得分:0)

最简单的方法是单遍循环。

$byProduct = [];

foreach($bills as $bill)
{
    $key = $bill['product_id'];
    if (!isset($byProduct[$key])) {
        $byProduct[$key] = [
            'product_id' => $key,
            'total' => 0
        ];
    }

    $byProduct[$key]['total'] += $bill['total'];
}

var_dump($byProduct)的结果:

array(2) {
  [1] =>
  array(2) {
    'product_id' =>
    string(1) "1"
    'total' =>
    int(80)
  }
  [2] =>
  array(2) {
    'product_id' =>
    string(1) "2"
    'total' =>
    int(70)
  }
}

另一种方法是使用array_walk,但在复杂度方面几乎是相同的:

$byProduct = [];

array_walk($bills, function(&$bill) use (&$byProduct) {
    $key = $bill['product_id'];
    if (!isset($byProduct[$key])) {
        $byProduct[$key] = [
            'product_id' => $key,
            'total' => 0
        ];
    }

    $byProduct[$key]['total'] += $bill['total'];
});