【问题标题】:PHP Array Group by same values and SUMPHP Array Group 按相同的值和 SUM
【发布时间】:2020-01-11 03:05:33
【问题描述】:

我正在尝试按具有相同值和键的数组进行分组。

我有这个数组输入,我使用下面的函数将它按员工编号分组

  0 => array:7 [▼
    "employee_no" => "04052018"
    "employee_id" => 317
    "company_id" => 4
    "name" => ""
    "total_hours" => 8
    "monthly_salary" => 15898.53
    "daily_salary" => 611.48
  ]
  1 => array:7 [▼
    "employee_no" => "06282018"
    "employee_id" => 319
    "company_id" => 4
    "name" => ""
    "total_hours" => 8
    "monthly_salary" => 32553.0
    "daily_salary" => 1252.04
  ]
  2 => array:7 [▼
    "employee_no" => "09291998"
    "employee_id" => 320
    "company_id" => 4
    "name" => " "
    "total_hours" => 8
    "monthly_salary" => 108916.75
    "daily_salary" => 4189.11
  ]
  3 => array:7 [▼
    "employee_no" => "12052011"
    "employee_id" => 323
    "company_id" => 4
    "name" => ""
    "total_hours" => 8
    "monthly_salary" => 36601.03
    "daily_salary" => 1407.73
  ]

我已经使用这个函数按数组分组了

private function group_by($key, $data) {
    $result = array();

    foreach($data as $val) {
        if(array_key_exists($key, $val)){
            $result[$val[$key]][] = $val;
        }else{
            $result[""][] = $val;
        }
    }

    return $result;
}

我就是这样用的

$data = $this->group_by("employee_no", $employee_attendance);

向我证明这种结果

"04052018" => array:7 [▼
    0 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 317
      "company_id" => 4
      "name" => ""
      "total_hours" => 8
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]
    1 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 328
      "company_id" => 4
      "name" => ""
      "total_hours" => 8
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]
    2 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 343
      "company_id" => 4
      "name" => ""
      "total_hours" => 8
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]
    3 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 370
      "company_id" => 4
      "name" => ""
      "total_hours" => 2
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]
    4 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 377
      "company_id" => 4
      "name" => ""
      "total_hours" => 2
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]
    5 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 385
      "company_id" => 4
      "name" => ""
      "total_hours" => 8
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]
    6 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 396
      "company_id" => 4
      "name" => ""
      "total_hours" => 8
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]
  ]

它所做的就是按与关键员工编号相同的值的数组进行分组。

我现在想要的是获取每个员工编号的总小时数。数组数据包含多个员工编号。喜欢这个

0 => array:7 [▼
      "employee_no" => "04052018"
      "employee_id" => 317
      "company_id" => 4
      "name" => ""
      "total_hours" => 48 -> calculated total hours
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]

1 => array:7 [▼
      "employee_no" => "04052019"
      "employee_id" => 318
      "company_id" => 4
      "name" => ""
      "total_hours" => 24 -> calculated total hours
      "monthly_salary" => 15898.53
      "daily_salary" => 611.48
    ]

我尝试使用 array_sum 但没有得到我想要的结果。

【问题讨论】:

  • 你的输入数组的内容是什么?
  • 试试这个:array_sum(array_column($data['%id%'], 'total_hours'));
  • 试试$total_hours = array_sum(array_column($data["04052018"], 'total_hours'))
  • 我在分组之前用数组集合更新了答案
  • 其中包含许多不同的员工编号 - 那么您到底想要只针对特定 ID 04052018 的结果,还是针对所有这些?你说你想要一个“单一的结果”……

标签: php arrays laravel


【解决方案1】:

把你的函数改成

private function group_by($key, $data) {
    $result = array();
    foreach($data as $val) {
        array_key_exists($val[$key], $result) 
        ?
        ($result[$val[$key]]['total_hours'] += $val['total_hours'])
        :
        ($result[$val[$key]] = $val);
    }
    return $result;
}

【讨论】:

  • 我不认可不用于回报或分配的三元;我发现代码更难阅读。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2011-04-04
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多