php - 以不同格式迭代和求和一个级别的数组
问题描述
我现在有一个数据数组,它产生的格式基本相同,但在每个级别中,我都有一个与之前的项目略有不同的总计索引。
我目前正在循环它,但每次迭代的“总”索引都有问题,因为它的格式更扁平,级别也不多。我在这里使用“亚当”作为示例,但想法是有多个具有相同格式的数组的人,我想按类别总计,然后按部门总计(“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,
),
解决方案
推荐阅读
- angular - router.navigate 中的 {skipLocationChange : true} 不起作用;改变状态
- c# - 没有 APIController 属性的版本化 API Explorer
- javascript - 如何从 ES6 JavaScript 类实例中获取源代码位置?
- java - Javafx Google 按高度和经度映射标记
- c - 我们可以减去 NULL 指针吗?
- javascript - Angular6:无法访问获取异步数据的模板中的 js 变量
- java - 在 Netbeans Java 应用程序上,如何通过单击按钮打开新页面(不是弹出窗口)?
- typescript - 如何声明打字稿模块以防止“隐式具有'任何'类型”错误?
- python - 当 DEBUG=False 时不会触发自定义记录器
- codenameone - 我的 GUI 构建器与 codenameone 网站上的参考图像不匹配是否有原因?