Php 重新索引数组并添加总计

Php 重新索引数组并添加总计,php,laravel,Php,Laravel,我试图找出如何通过给定的键重新构造数组和总值。我当前有一个名为$data的数组,它返回以下结果: Bill => array:3 [▼ "01" => array:6 [▼ "Food " => array:2 [▶] hamburger=>array:[ sales=> 210.00 purchases=>200.00 ] burrito=

我试图找出如何通过给定的键重新构造数组和总值。我当前有一个名为
$data
的数组,它返回以下结果:

Bill => array:3 [▼
  "01" => array:6 [▼
    "Food " => array:2 [▶]
      hamburger=>array:[
        sales=> 210.00
        purchases=>200.00
      ]
      burrito=>array:[
        sales=> 100.00
        purchases=>40.00
      ]
    "Drink     " => array:2 [▶]
      coke=>array:[
        sales=> 210.00
        purchases=>200.00
      ]
      pepsi=>array:[
        sales=> 100.00
        purchases=>40.00
      ]
    "total" => array:7 [▶]
      sales=>620.00
      purchases=>480.00
  ]
]
Ted => array:3 [▼
  "01" => array:6 [▼
    "Food " => array:2 [▶]
      hamburger=>array:[
        sales=> 110.00
        purchases=>100.00
      ]
      burrito=>array:[
        sales=> 120.00
        purchases=>40.00
      ]
    "Drink     " => array:2 [▶]
      coke=>array:[
        sales=> 110.00
        purchases=>100.00
      ]
      pepsi=>array:[
        sales=> 120.00
        purchases=>40.00
      ]
    "total" => array:7 [▶]
      sales=>460.00
      purchases=>280.00
  ]
]
我的问题是,我需要把它装进一个拉威尔刀片,它与比尔或泰德无关,而是每个人的总数。如果现有的键是“Bill”和“Ted”,我需要新的结构实际由“01”标识,但我想合计该级别内的所有类别。所以我希望得到这样的结果:

"01" =>[▼
  "Food " => array:2 [▶]
    hamburger=>array:[
      sales=> 320.00
      purchases=>300.00
    ]
    burrito=>array:[
      sales=> 220.00
      purchases=>140.00
    ]
  "Drink     " => array:2 [▶]
    coke=>array:[
      sales=> 320.00
      purchases=>300.00
    ]
    pepsi=>array:[
      sales=> 220.00
      purchases=>80.00
    ]
  "total" => array:7 [▶]
    sales=>1080.00
    purchases=>760.00
 ] 
我可以很容易地循环如下:

foreach($data as $key=> $value){
  foreach($value as $categoryNumber => $categories){
    foreach($categories as $categoryDetails => $details){
  
    }
  }
}

但是我完全被困在如何通过新的指数来重新构造这个和总计的问题上

我不确定你是如何得出上述的
dd(),我相信在到达这里之前有更好的方法收集这些总数。但现在您已经到了这里(比如,您通过API或其他方式收到此消息),这将使总数如您所述:

$result = [];
foreach ($input as $i) {
    foreach ($i as $group => $n) {
        if (!array_key_exists($group, $result)) $result[$group] = [];
        foreach ($n as $category_name => $category) {
            if (!array_key_exists($category_name, $result[$group])) $result[$group][$category_name] = [];
            foreach ($category as $item_name => $item) {
                if (!array_key_exists($item_name, $result[$group][$category_name])) {
                    $result[$group][$category_name][$item_name] = $item;
                } else {
                    foreach ($item as $purpose => $dollars) {
                        $result[$group][$category_name][$item_name][$purpose] += $dollars;
                    }
                }
            }
        }
    }
}

在每一步中,我都检查数组键是否存在,如果不存在,则创建它。如果忽略这些检查,您将看到我只是简单地复制内容,并在必要时求和。

您可以这样做

<?php
$data = [
    'Bill' => [
        "01" => [
            "Food" => [
                'hamburger' => [
                    'sales' => 210.00,
                    'purchases' => 200.00,
                ],
                'burrito' => [
                    'sales' => 100.00,
                    'purchases' => 40.00,
                ],
            ],
            "Drink" => [
                'coke' => [
                    'sales' => 210.00,
                    'purchases' => 200.00,
                ],
                'pepsi' => [
                    'sales' => 100.00,
                    'purchases' => 40.00,
                ],
            ],
            "total" => [
                'sales' => 620.00,
                'purchases' => 480.00,
            ],
        ]
    ],
    'Ted' => [
        "01" => [
            "Food" => [
                'hamburger' => [
                    'sales' => 110.00,
                    'purchases' => 100.00,
                ],
                'burrito' => [
                    'sales' => 120.00,
                    'purchases' => 40.00,
                ],
            ],
            "Drink" => [
                'coke' => [
                    'sales' => 110.00,
                    'purchases' => 100.00,
                ],
                'pepsi' => [
                    'sales' => 120.00,
                    'purchases' => 40.00,
                ],
            ],
            "total" => [
                'sales' => 460.00,
                'purchases' => 280.00,
            ],
        ]
    ]
];
$finalResults = [];
foreach ($data as $userName => $bills) {
    foreach ($bills as $billIndex => $billParts) {
        if (!array_key_exists($billIndex, $finalResults)) {
            $finalResults[$billIndex] = [
                'total' => [
                    'sales' => 0,
                    'purchases' => 0,
                ]
            ];
        }
        foreach ($billParts as $partIndex => $details) {
            if (!array_key_exists($partIndex, $finalResults[$billIndex])) {
                $finalResults[$billIndex][$partIndex] = [];
            }
            if ($partIndex !== 'total') {
                foreach ($details as $productCode => $productData) {
                    if (!array_key_exists($productCode, $finalResults[$billIndex][$partIndex])) {
                        $finalResults[$billIndex][$partIndex][$productCode] = [
                            'sales' => 0,
                            'purchases' => 0,
                        ];
                    }
                    $finalResults[$billIndex][$partIndex][$productCode]['sales'] += $productData['sales'];
                    $finalResults[$billIndex][$partIndex][$productCode]['purchases'] += $productData['purchases'];
                }
            } else {
                $finalResults[$billIndex][$partIndex]['sales'] += $details['sales'];
                $finalResults[$billIndex][$partIndex]['purchases'] += $details['purchases'];
            }
        }
    }
}
print_r($finalResults);

这相当简单。创建一个新数组以保存结果。获取当前循环键,如果它不存在,则在结果中创建它并复制该值,否则只需将该值添加到现有值。使用collect,因为你甚至没有提供原始数据,我也不想格式化它。@michael_mano我不一定要求任何人“为我做”,我只是不确定到底该怎么做,不管是在laravel还是在laravel(我对php还是比较新)。此外,我转储了原始数据,并试图在我的文本编辑器中对其进行正确格式化,但我将尝试另一种方法。这里有一个
var\u导出
,认为它是正确的,必须手动构建数组。。是的,收集方法是你的friends@lagbox谢谢你!这很有帮助,谢谢!事实上,我使用的是API,否则我会在内部重新构造数据