重构数组循环到另一个数组中进行赋值


refactoring array looped around another arrary for assignment

我知道这更多的是PHP问题,因为它的数组类型很松散,但在我接手的一个项目中,我到处都看到了这个问题,我不确定重构它的最佳方法。假设你有两组数据,都是多维数组,$results_by_entity和$target_limits,我们想检查每个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-处理此问题所需的时间随着数据大小的增长呈指数级增长

我读了马丁·福勒的《重构》一书,这本书真的很有帮助,但我认为这种类型的问题并没有真正出现,主要是因为他的例子是用强类型的JAVA编写的。该类是超级运行的,因此很难调试和扩展,但所有数据都绑定在一起,主要是因为这些类型的循环,所以不确定如何解决。任何建议都将不胜感激

如果可能的话,您想要的是预先为数据建立索引:

$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;
    }
}