Handling multiple try-catches in a for loop
You need anything here but a try catch.
foreach($data as $key =&gt; $row) {
    // $row['tower'] = 'Hello World Tower'
    // Try to see if $row['tower'] is present in the $towers data source
    if (isset($towers[$row['tower']])) {
        $data[$key]['tower'] = $towers[$row['tower']];
    } else {
        $error_holder[$key]['tower_error'] = &quot;Tower not found for $key&quot;;
    }

    if (isset($departments[$row['department']])) {
        $data[$key]['department'] = $departments[$row['department']];
    } else {
        $error_holder[$key]['tower_error'] = &quot;Department not found for $key&quot;;
    }
}

Although you can reduce the duplication by storing sources into array and looping over it but honestly it makes the code so muddled that I don't see the benefit.
foreach (compact('tower','department') as $name =&gt; $column)
    foreach($data as $key =&gt; $row) {
        if (isset($column[$row[$name]])) {
            $data[$key][$name] = $column[$row[$name]];
        } else {
            $error_holder[$key][$name.'_error'] = &quot;$name not found for $key&quot;;
        }
    }
}