【问题标题】:Laravel Collection - Returning a total with sum() on nested arraysLaravel 集合 - 在嵌套数组上返回总和()
【发布时间】:2019-11-08 17:08:04
【问题描述】:

我正在尝试使用 sum() 通过从 $collection 中的每个用户获取“持续时间”来返回总计

结构是

USER > CONTRACT_RESULTS > DAYS > DATE > ACTIVITIES > ACTIVITY

我想查询活动的“类型”并拉回与该活动关联的持续时间。

当它的嵌套少得多时,我让它工作了:

$collection->whereIn('activity',['off'])->sum('duration'); 

但我现在不知所措,因为它们是如此嵌套,并且数组的名称是动态的

下面是 $collection 中 1 个用户的结构示例:

array:13 [▼
  "user_id" => 52
   "contract_results" => array:2 [▼
    "2019-10-21 - 2019-10-31" => array:10 [▼
      "hours_a_week" => "20"
      "days" => array:1 [▼
        "2019-10-21" => array:2 [▼
          "bank_holiday" => "no"
          "activities" => array:2 [▼
            "10:00 - 22:00" => array:5 [▼
              "type" => "driving"
              "from" => "10:00"
              "to" => "22:00"
              "duration" => 720
              "night_minutes" => 60
            ]
            "22:00 - 00:00" => array:5 [▼
              "type" => "driving"
              "from" => "22:00"
              "to" => "00:00"
              "duration" => 120
              "night_minutes" => 120
            ]
          ]
        ]
      ]
    ]
    "2019-11-01 - 2019-11-10" => array:10 [▼
      "hours_a_week" => "10"
      "days" => array:1 [▼
        "2019-11-01" => array:2 [▼
          "bank_holiday" => "yes"
          "activities" => array:1 [▼
            "10:00 - 22:00" => array:5 [▼
              "type" => "availability"
              "from" => "10:00"
              "to" => "22:00"
              "duration" => 720
              "night_minutes" => 60
            ]
          ]
        ]
      ]
    ]
  ]
]

我是新手,非常感谢您的意见!

【问题讨论】:

  • 什么是activity?我在你的收藏中没有看到 activity
  • 活动是在“活动”数组下名称设置为时间的数组 - 示例是“10:00 - 22:00”,其中每个是类型、从、到、持续时间、夜间分钟
  • 对不起,我不明白。看看你的->whereIn('activity', ['off'])。我在你的收藏中没有看到 activity 键。
  • 在我有一个更简单的数组之前,有一个名为“activity”的数组,现在我有一个更复杂的嵌套数组,还有一个名为“activities”的数组,在这么多动态名称的数组中像“10:00 - 22:00”这些现在是我需要查询的新“活动”。如果它是一个循环,它会像: $duration_total = '';对于每个“天”作为一天 - 对于每个活动作为活动 $duration_total .= 持续时间

标签: laravel eloquent


【解决方案1】:

根据您的unclear 信息,我能做的只有这些:

$durationTotal = collect($data->get('contract_results'))
        ->transform(function ($contractResult) {
            return array_merge((array) $contractResult, [
                'days' => collect(data_get($contractResult, 'days'))
                    ->transform(function ($day) {
                        return array_merge((array) $day, [
                            'activities' => collect(data_get($day, 'activities'))
                                ->whereIn('type', ['driving'])
                                ->toArray()
                        ]);
                    })
                    ->toArray()
            ]);
        })
        ->sum(function ($item) {
            return array_sum(data_get($item, 'days.*.activities.*.duration', []));
        });

【讨论】:

  • 刚刚有机会试一试,效果很好 - 非常感谢 - 很抱歉不清楚
  • 很高兴如果它有效。随意询问您是否还有其他问题。也请随意投票?
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多