PHP数组和组中的相同项组计数

时间:2016-01-21 16:01:28

标签: php arrays loops foreach

我正在尝试创建一个将相似/相同项目组合在一起的数组,并创建项目发生次数的计数/计数。

我设法得到一个输出的数组,看起来像这样:

Code            Item
WX4RCDWK3VJ7M   Caesar Salad
WX4RCDWK3VJ7M   Caesar Salad
YTZ8346445MFT   Wolfblass Cab Sauvignon
XGZ4NDEDKTCGY   Rib Eye 16 oz
A50NPRW74C5K6   Filet 8 oz
A50NPRW74C5K6   Filet 8 oz
A50NPRW74C5K6   Filet 8 oz

我希望输出看起来像这样:

Code            Item                      Count
WX4RCDWK3VJ7M   Caesar Salad              2
YTZ8346445MFT   Wolfblass Cab Sauvignon   1 
XGZ4NDEDKTCGY   Rib Eye 16 oz             1
A50NPRW74C5K6   Filet 8 oz                3

目前我已经设法正确地达到了这一点,基于原始广泛的多维数组($ orders [] ['lineItems'] ['elements'] []):

foreach ($orders as $order){
  foreach ($order['lineItems']['elements'] as $item){
       $product['code'] = $item['item']['code'];
       $product['name'] = $item['name'];
       $products[] = $product;
  }
}
print_r ($products);

我尝试过使用array_count_values,但在我的终端中输入错误“只能计算STRING和INTEGER值!”。

我已尝试将产品['code']作为输出数组($ products)的键进行循环,并增加产品['count']项。

这似乎应该是非常基本的,但我遗漏了一些东西。

编辑:我正在循环的原始数组看起来像这样(我已经取出了大多数不相关的部分) - 这是一个单一的“订单”,其中有很多。

"orders" : {
    "elements": [1]
        0: {
            "currency" : "EUR"
            "lineItems": {
                "elements": [2]
                    0:  {
                        "item": {
                                "code": "ASDFXCVDGRRGTG"
                            }-
                        "name": "Caesar Salad"
                        "price": 400
                    },
                    1:  {
                        "item": {
                                "code": "QWEWERRTERTT"
                            }-
                        "name": "Crafty Beer"
                        "price": 100
                    }
            }
            "createdTime": 1453386417000      
    }
}

EDIT2 - 将'id'更改为'code'以避免数字和非数字数组之间的混淆

2 个答案:

答案 0 :(得分:1)

您希望按ID计数。使用一个单独的数组,用id键入来执行此操作。

$itemCounts = array();
foreach($products as $product)
{
    if (!isset($itemCounts[$product['code']]))
    {
        $itemCounts[$product['code']] = 0;
    }
    $itemCounts[$product['code']]++;
}
print_r($itemCounts);

如果需要,您可以将所有内容都放在一个数组中,仍然按ID键入:

$itemCounts = array();
foreach($products as $product)
{
    if (!isset($itemCounts[$product['code']]))
    {
        $itemCounts[$product['code']] = array(
            'name' => $product['name'],
            'count' => 0
        );
    }
    $itemCounts[$product['code']]['count']++;
}
print_r($itemCounts);

您可以通过不创建$ products来优化此功能。将上面代码中的$ products替换为原始$ orders数组中的相应项目。

修改

上面的代码片段为您提供了正确的数组结构来处理这种类型的数据。要从上面的第二个代码段生成您想要的输出,您需要执行以下操作:

foreach($itemCounts as $code => $item)
{
    print $code . " " . $item['name'] . " " . $item['count'] . "\n";
}

答案 1 :(得分:1)

循环的外部部分看起来应该适用于此。您只需要对它如何构建分组数组进行一些更改。

foreach ($orders as $order) {
    foreach ($order['lineItems']['elements'] as $item) {
        // use the item id as a key in the array you are building
        $id = $item['item']['id'];

        if (isset($products[$id])) {
            // if the item has already been added, increment the count
            $products[$id]['Count']++;
        } else {
            // otherwise, add the item with an initial count of 1
            $products[$id]['ID'] = $id;
            $products[$id]['Item'] = $item['name'];
            $products[$id]['Count'] = 1;
        }
    }
}

生成的$products数组将项目ID作为键。如果您希望它具有数字键,则可以执行以下操作:

$products = array_values($products);