Data Quality Scorecard Snippet
Calculates a compact data quality scorecard for required fields, email format, and duplicate identifiers.
Purpose
Calculates a compact data quality scorecard for required fields, email format, and duplicate identifiers.
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.
*/
/**
* Data Quality Scorecard Snippet.
*
* Purpose:
* Reviews a small dataset and returns counts for missing required fields,
* invalid email values, duplicate IDs, and an overall quality score.
*
* @param array $records Records to review.
* @param array $required_fields Required field names.
* @param string $id_field Field used as the duplicate identity key.
* @return array Data quality scorecard.
*/
function ogSnippetDataQualityScorecardSnippet(array $records, array $required_fields, string $id_field): array {
$total_records = count($records);
$missing_required = 0;
$invalid_email = 0;
$duplicate_ids = 0;
$seen_ids = array();
foreach ($records as $record) {
if (is_array($record) === false) {
continue;
}
foreach ($required_fields as $field_name) {
$clean_field = (string) $field_name;
if ($clean_field !== '') {
if (isset($record[$clean_field]) === false || trim((string) $record[$clean_field]) === '') {
$missing_required++;
}
}
}
if (isset($record['email']) === true && trim((string) $record['email']) !== '') {
if (filter_var($record['email'], FILTER_VALIDATE_EMAIL) === false) {
$invalid_email++;
}
}
if ($id_field !== '' && isset($record[$id_field]) === true) {
$id_value = trim((string) $record[$id_field]);
if ($id_value !== '') {
if (isset($seen_ids[$id_value]) === true) {
$duplicate_ids++;
} else {
$seen_ids[$id_value] = true;
}
}
}
}
$issue_count = $missing_required + $invalid_email + $duplicate_ids;
$score = 100;
if ($total_records > 0) {
$score = 100 - min(100, (int) round(($issue_count / $total_records) * 20));
}
return array(
'total_records' => $total_records,
'missing_required' => $missing_required,
'invalid_email' => $invalid_email,
'duplicate_ids' => $duplicate_ids,
'score' => $score
);
}
$records = array(
array('crew_id' => 'SG-1', 'name' => 'Samantha Carter', 'email' => 'carter@example.test'),
array('crew_id' => 'SG-1', 'name' => '', 'email' => 'not-an-email')
);
$scorecard = ogSnippetDataQualityScorecardSnippet($records, array('crew_id', 'name'), 'crew_id');
echo 'Stargate data quality score: '.$scorecard['score'];