public function updateDecisionTreeResponses($side, $update_responses)
{
$current_responses = array();
$save_responses = array();
if ($side == $this::LEFT) {
$responses = $this->left_responses;
} elseif ($side == $this::RIGHT) {
$responses = $this->right_responses;
} else {
throw Exception('Invalid side value');
}
foreach ($responses as $curr_resp) {
$current_responses[$curr_resp->node_id] = $curr_resp;
}
// go through each node response, if there isn't one for this element,
// create it and store for saving
// if there is, check if the value is the same ... if it has changed
// update and store for saving, otherwise remove from the current responses array
// anything left in current responses at the end is ripe for deleting
foreach ($update_responses as $node_id => $value) {
if (!array_key_exists($node_id, $current_responses)) {
$s = new OphCoTherapyapplication_PatientSuitability_DecisionTreeNodeResponse();
$s->attributes = array('patientsuit_id' => $this->id, 'eye_id' => $side, 'node_id' => $node_id, 'value' => $value);
$save_responses[] = $s;
} else {
if ($current_responses[$node_id]->value != $value) {
$current_responses[$node_id]->value = $value;
$save_responses[] = $current_responses[$node_id];
}
// don't want to delete this, so remove from list which we use later to delete
unset($current_responses[$node_id]);
}
}
// save what needs saving
foreach ($save_responses as $save) {
$save->save();
}
// delete any that are no longer relevant
foreach ($current_responses as $curr) {
$curr->delete();
}
}