<?php
function validateNestedString(array $data, array $expectedFormats): array
{
$results = [];
foreach ($expectedFormats as $key => $format) {
$value = $data[$key] ?? null; // Handle missing keys
if ($value === null) {
$results[$key] = ['valid' => false, 'message' => 'Missing value'];
continue;
}
$isValid = true;
$message = '';
foreach ($format as $field => $validation) {
$valueToCheck = $value; //use the value, regardless of field.
if (is_string($validation)) {
// Simple string validation (e.g., length, pattern)
if (preg_match($validation, $valueToCheck) === 0) {
$isValid = false;
$message = $field . ': Invalid format';
break;
}
} elseif (is_array($validation)) {
// Nested validation
if (!is_array($valueToCheck) || !is_array($validation)) {
$isValid = false;
$message = $field . ': Invalid nested structure';
break;
}
$nestedValid = true;
foreach ($validation as $nestedField => $nestedValidation) {
$nestedValue = $valueToCheck[$nestedField];
if(!is_string($nestedValue)){
$nestedValid = false;
$message = $field . "." . $nestedField . ": Invalid nested value type";
break;
}
if (preg_match($nestedValidation, $nestedValue) === 0) {
$nestedValid = false;
$message = $field . "." . $nestedField . ': Invalid format';
break;
}
}
if (!$nestedValid) {
$isValid = false;
$message = $field . "." . $nestedField . ': Invalid format';
}
}
}
if ($isValid) {
$results[$key] = ['valid' => true, 'message' => 'Valid'];
} else {
$results[$key] = ['valid' => false, 'message' => $message];
}
}
return $results;
}
// Example Usage:
$data = [
'name' => 'John Doe',
'email' => 'john.doe@example.com',
'age' => 30,
'address' => [
'street' => '123 Main St',
'city' => 'Anytown',
'zip' => '12345'
],
'phone' => '555-123-4567'
];
$expectedFormats = [
'name' => '^[A-Za-z ]+$', // name should be letters and spaces
'email' => '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', //email validation
'address' => [
'street' => '^[A-Za-z0-9 ]+$', // street should be letters and spaces
'city' => '^[A-Za-z ]+$', // city should be letters and spaces
'zip' => '^\d{5}$' // zip should be 5 digits
],
'phone' => '^\d{3}-\d{3}-\d{4}$' //phone number format
];
$validationResults = validateNestedString($data, $expectedFormats);
print_r($validationResults);
?>
Add your comment