我知道这更多是PHP的问题,因为它的数组打字很松散但我在接管的项目中看到了这个问题,并且不确定重构它的最佳方法。假设您有两组数据,包括多维数组,$ results_by_entity和$ target_limits,我们想要检查目标是fore_ result_by_entity,以便我们设置一些状态
foreach ($results_by_entity AS $result_by_entity) {
foreach ($target_limits AS $target_limit) {
if ($target_limit['activity_id'] == $result_by_entity['activity_id']) {
$result_by_entity->target = $target_limit->quantity;
$result_by_entity->progress = $target_limit->score;
}
}
}
这里有几个主要问题
1 - 数据非常强大,因此很难将$ results_by_entity重构到它自己的类中,并将$ target_limits重构为它自己的类 2 - 随着数据大小的增长,处理此过程所需的时间呈指数级增长
我阅读了Martin Fowler撰写的重构书,它真的很有帮助,但这种问题并没有真正体现出来,我认为主要是因为他的例子是JAVA中强类型的。这个类是超级运行的,所以很难调试和扩展但是所有的数据都是如此捆绑在一起主要是因为这些类型的循环所以不确定如何解决。任何建议都会非常感激
答案 0 :(得分:1)
如果可能,您想要的是先发制人的数据索引:
$results_index = array();
foreach ($results_by_entity AS $result_by_entity) {
//Index this value
$results_index[$result_by_entity['activity_id']] = $result_by_entity; //Add a & in front if it's a scalar value, but it looks like it's an object in your example
}
foreach ($target_limits AS $target_limit) {
//Find the corresponding activity id in results
if (isset($results_index[$target_limit['activity_id']])) {
$result_by_entity = $results_index[$target_limit['activity_id']];
$result_by_entity->target = $target_limit->quantity;
$result_by_entity->progress = $target_limit->score;
}
}