更好地重构地图功能
Better refactoring of map function
我目前正在重构我的方法。
我已经消除了 long foreach 和 if 状态,但现在我在最后完成时有点挣扎,以获得一个很好的地图功能。
我的方法是这样的。
/**
* @param \Illuminate\Support\Collection
* @return array
*/
public static function convertTimesToChartData($times) {
$clientTotal = '0';
$arrayIndex = 0;
$chartData = collect($times)->filter(function($item) {
return !is_null($item->end_time);
})->map(function($item) use(&$clientTotal, &$arrayIndex){
$clients[$arrayIndex]['id'] = $item->client_id;
$clients[$arrayIndex]['project_id'] = $item->project_id;
$clients[$arrayIndex]['label'] = $item->company;
$clients[$arrayIndex]['sec'] = $item->end_time->timestamp - $item->start_time->timestamp;
$clientTotal += $item->end_time->timestamp - $item->start_time->timestamp;
$arrayIndex++;
return $clients;
})->flatMap(function($item) { return $item; });
return $chartData;
}
这里,我有两个问题:
有没有更好的分配数组的方法?当我尝试直接在 return 中分配时,例如
return [
[$arrayIndex]['id'] => $item->client_id,
[$arrayIndex]['project_id'] => $item->project_id,
[$arrayIndex]['label'] => $item->company,
[$arrayIndex]['sec'] => $item->end_time->timestamp - $item->start_time->timestamp,
];
但是我得到一个未定义的索引错误。
- return 汇总数组的最佳方法是什么?因为我有同一个客户的多个时间条目,所以最后,我只想要汇总的秒数。它适用于我的示例,但我认为有更好的方法可以做到这一点。特别是因为我需要定义一个 $arrayIndex ,我需要在 map 函数之外声明它并引用它。不要认为这是最好的方法。
原文出处:
$projects = array();
$projectTotal = '0';
foreach($taskTimes as $time){
if(!is_null($time->end_time))
{
if (isset($projects[$time->project_id]))
{
$projects[$time->project_id]['sec'] += $time->end_time->timestamp - $time->start_time->timestamp;
} else
{
$projects[$time->project_id]['id'] = $time->client_id;
$projects[$time->project_id]['label'] = $time->company;
$projects[$time->project_id]['sec'] = $time->end_time->timestamp - $time->start_time->timestamp;
}
$projectTotal += $time->end_time->timestamp - $time->start_time->timestamp;
}
}
感谢您的建议和帮助!
要获得与原始 foreach 循环相同的结果,您可以这样:
$projects = collect($taskTimes)
->filter(function ($time) {
return !is_null($time->end_time);
})
->groupBy('project_id')
->map(function ($group) {
$group = collect($group);
return [
'id' => $group->first()->client_id,
'project_id' => $group->first()->project_id,
'label' => $group->first()->company,
'sec' => $group->sum(function ($item) {
return $item->end_time->timestamp - $item->start_time->timestamp;
}),
];
});
$projectsTotal = $projects->sum('sec');
我已将 project_id
添加到结果数组中,因为它包含在您的 convertTimesToChartData()
方法示例中
希望对您有所帮助!
我目前正在重构我的方法。 我已经消除了 long foreach 和 if 状态,但现在我在最后完成时有点挣扎,以获得一个很好的地图功能。
我的方法是这样的。
/**
* @param \Illuminate\Support\Collection
* @return array
*/
public static function convertTimesToChartData($times) {
$clientTotal = '0';
$arrayIndex = 0;
$chartData = collect($times)->filter(function($item) {
return !is_null($item->end_time);
})->map(function($item) use(&$clientTotal, &$arrayIndex){
$clients[$arrayIndex]['id'] = $item->client_id;
$clients[$arrayIndex]['project_id'] = $item->project_id;
$clients[$arrayIndex]['label'] = $item->company;
$clients[$arrayIndex]['sec'] = $item->end_time->timestamp - $item->start_time->timestamp;
$clientTotal += $item->end_time->timestamp - $item->start_time->timestamp;
$arrayIndex++;
return $clients;
})->flatMap(function($item) { return $item; });
return $chartData;
}
这里,我有两个问题:
有没有更好的分配数组的方法?当我尝试直接在 return 中分配时,例如
return [ [$arrayIndex]['id'] => $item->client_id, [$arrayIndex]['project_id'] => $item->project_id, [$arrayIndex]['label'] => $item->company, [$arrayIndex]['sec'] => $item->end_time->timestamp - $item->start_time->timestamp, ];
但是我得到一个未定义的索引错误。
- return 汇总数组的最佳方法是什么?因为我有同一个客户的多个时间条目,所以最后,我只想要汇总的秒数。它适用于我的示例,但我认为有更好的方法可以做到这一点。特别是因为我需要定义一个 $arrayIndex ,我需要在 map 函数之外声明它并引用它。不要认为这是最好的方法。
原文出处:
$projects = array();
$projectTotal = '0';
foreach($taskTimes as $time){
if(!is_null($time->end_time))
{
if (isset($projects[$time->project_id]))
{
$projects[$time->project_id]['sec'] += $time->end_time->timestamp - $time->start_time->timestamp;
} else
{
$projects[$time->project_id]['id'] = $time->client_id;
$projects[$time->project_id]['label'] = $time->company;
$projects[$time->project_id]['sec'] = $time->end_time->timestamp - $time->start_time->timestamp;
}
$projectTotal += $time->end_time->timestamp - $time->start_time->timestamp;
}
}
感谢您的建议和帮助!
要获得与原始 foreach 循环相同的结果,您可以这样:
$projects = collect($taskTimes)
->filter(function ($time) {
return !is_null($time->end_time);
})
->groupBy('project_id')
->map(function ($group) {
$group = collect($group);
return [
'id' => $group->first()->client_id,
'project_id' => $group->first()->project_id,
'label' => $group->first()->company,
'sec' => $group->sum(function ($item) {
return $item->end_time->timestamp - $item->start_time->timestamp;
}),
];
});
$projectsTotal = $projects->sum('sec');
我已将 project_id
添加到结果数组中,因为它包含在您的 convertTimesToChartData()
方法示例中
希望对您有所帮助!