Skip to content
← Back to Snippets
Code

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.';
}