我正在尝试创建一个将相似/相同项目组合在一起的数组,并创建项目发生次数的计数/计数。
我设法得到一个输出的数组,看起来像这样:
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'以避免数字和非数字数组之间的混淆
答案 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);