Multi-Source Record Merge Preview
Builds a field-by-field preview before merging several source records into one chosen record.
Purpose
Builds a field-by-field preview before merging several source records into one chosen record.
Snippet details
ContextArrayLevelAdvancedCopy-and-paste statusMarked safe after review.Categories
- Security
Code
<?php
/*
* Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
* Free for personal and internal use. Paid project use requires visible credit
* to Jeffery L. Paris. Corporate use requires a paid license fee unless a
* separate written license states otherwise.
*/
/**
* Multi-Source Record Merge Preview.
*
* Purpose:
* Compares candidate source records and shows which value would win for each
* field before a merge operation is committed.
*
* @param array $source_records Associative records keyed by source name.
* @param array $field_priority Preferred source order for each field.
* @return array Merge preview with chosen values and conflicts.
*/
function ogSnippetMultisourceRecordMergePreview(array $source_records, array $field_priority): array {
$preview = array();
$conflicts = array();
$all_fields = array();
foreach ($source_records as $source_name => $record) {
if (is_array($record) === false) {
continue;
}
foreach ($record as $field_name => $value) {
$all_fields[$field_name] = $field_name;
}
}
foreach ($all_fields as $field_name) {
$candidates = array();
$chosen_source = '';
$chosen_value = null;
foreach ($source_records as $source_name => $record) {
if (is_array($record) === true && array_key_exists($field_name, $record) === true && trim((string) $record[$field_name]) !== '') {
$candidates[$source_name] = $record[$field_name];
}
}
if (isset($field_priority[$field_name]) === true && is_array($field_priority[$field_name]) === true) {
foreach ($field_priority[$field_name] as $preferred_source) {
if (array_key_exists($preferred_source, $candidates) === true) {
$chosen_source = (string) $preferred_source;
$chosen_value = $candidates[$preferred_source];
break;
}
}
}
if ($chosen_source === '' && count($candidates) > 0) {
foreach ($candidates as $source_name => $value) {
$chosen_source = (string) $source_name;
$chosen_value = $value;
break;
}
}
if (count(array_unique(array_map('strval', $candidates))) > 1) {
$conflicts[$field_name] = $candidates;
}
$preview[$field_name] = array(
'chosen_source' => $chosen_source,
'chosen_value' => $chosen_value,
'candidates' => $candidates
);
}
return array(
'preview' => $preview,
'conflicts' => $conflicts,
'has_conflicts' => count($conflicts) > 0
);
}
$sources = array(
'starfleet' => array('vessel' => 'Enterprise', 'registry' => 'NCC-1701'),
'archive' => array('vessel' => 'Enterprise', 'registry' => 'NX-01')
);
$priority = array('registry' => array('starfleet', 'archive'));
$merge_preview = ogSnippetMultisourceRecordMergePreview($sources, $priority);
if ($merge_preview['has_conflicts'] === true) {
echo 'Star Trek merge preview found conflicts.';
} else {
echo 'Star Trek merge preview is clean.';
}