首页 > 解决方案 > 以不同格式迭代和求和一个级别的数组

问题描述

我现在有一个数据数组,它产生的格式基本相同,但在每个级别中,我都有一个与之前的项目略有不同的总计索引。

我目前正在循环它,但每次迭代的“总”索引都有问题,因为它的格式更扁平,级别也不多。我在这里使用“亚当”作为示例,但想法是有多个具有相同格式的数组的人,我想按类别总计,然后按部门总计(“01”和“04”,然后“Adam”、“Sam”等的总和。

我究竟做错了什么?

代码:

$data = array(
"Adam" => array (
"01" => array (
  "categories" => array(
    "CategoryOne"=> array(
      "downloads" => 10,
      "saves" => 2,
      "expected"=> array(
        "possible" => 30,
      ),
    ),
    "CategoryTwo"=> array(
      "downloads" => 15,
      "saves" => 8,
      "expected"=> array(
        "possible" => 15,
      ),
    ),
    "total"=> array(     //this totals all categories
      "downloads" => 25,
      "saves" => 10,
      "expected"=> array(
        "possible" => 45,
      ),
    ),
  ),
  "total"=> array(     //this would total anything under "01" like "categories", "items", etc.
    "downloads" => 25,
    "saves" => 10,
    "expected"=> array(
      "possible" => 45,
    ),
  ) ,     
),
"04" => array (
  "categories" => array(
    "CategoryOne"=> array(
      "downloads" => 10,
      "saves" => 2,
      "expected"=> array(
        "possible" => 30,
      ),
    ),
    "CategoryTwo"=> array(
      "downloads" => 15,
      "saves" => 8,
      "expected"=> array(
        "possible" => 15,
      ),
    ),
    "total"=> array(      //totals categories
      "downloads" => 25,
      "saves" => 10,
      "expected"=> array(
        "possible" => 45,
      ),
    ),
  ),
  "total"=> array(         //this would total anything under "04" like "categories", "items", etc.
    "downloads" => 25,
    "saves" => 10,
    "expected"=> array(
      "possible" => 45,
    ),
  ),        
),
"total"=> array(         //this would total "01" and "04".
  "downloads" => 50,
  "saves" => 20,
  "expected"=> array(
    "possible" => 90,
  ),
),
),
"total"=> array(         //this would be a grand total for Adam 
  "downloads" => 50,
  "saves" => 20,
  "expected"=> array(
    "possible" => 90,
  ),
)

);

$results = [];


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

dd($results);

期望的输出将是相似的,但对所有用户来说都是相似的,而不仅仅是 Adam:

"01" => array (
  "categories" => array(
    "CategoryOne"=> array(
      "downloads" => 10,
      "saves" => 2,
      "expected"=> array(
        "possible" => 30,
      ),
    ),
    "CategoryTwo"=> array(
      "downloads" => 15,
      "saves" => 8,
      "expected"=> array(
        "possible" => 15,
      ),
    ),
    "total"=> array(     //this totals all categories
      "downloads" => 25,
      "saves" => 10,
      "expected"=> array(
        "possible" => 45,
      ),
    ),
  ),
  "total"=> array(     //this would total anything under "01" like "categories", "items", etc.
    "downloads" => 25,
    "saves" => 10,
    "expected"=> array(
      "possible" => 45,
    ),
  ) ,     
),
"04" => array (
  "categories" => array(
    "CategoryOne"=> array(
      "downloads" => 10,
      "saves" => 2,
      "expected"=> array(
        "possible" => 30,
      ),
    ),
    "CategoryTwo"=> array(
      "downloads" => 15,
      "saves" => 8,
      "expected"=> array(
        "possible" => 15,
      ),
    ),
    "total"=> array(      //totals categories
      "downloads" => 25,
      "saves" => 10,
      "expected"=> array(
        "possible" => 45,
      ),
    ),
  ),
  "total"=> array(         //this would total anything under "04" like "categories", "items", etc.
    "downloads" => 25,
    "saves" => 10,
    "expected"=> array(
      "possible" => 45,
    ),
  ),        
),
"total"=> array(         //this would total "01" and "04".
  "downloads" => 50,
  "saves" => 20,
  "expected"=> array(
    "possible" => 90,
  ),
),
),
"total"=> array(         //this would be a grand total for all people in the array
  "downloads" => 50,
  "saves" => 20,
  "expected"=> array(
    "possible" => 90,
  ),

标签: phparraysforeach

解决方案


推荐阅读