1. <?php
  2. function validateNestedString(array $data, array $expectedFormats): array
  3. {
  4. $results = [];
  5. foreach ($expectedFormats as $key => $format) {
  6. $value = $data[$key] ?? null; // Handle missing keys
  7. if ($value === null) {
  8. $results[$key] = ['valid' => false, 'message' => 'Missing value'];
  9. continue;
  10. }
  11. $isValid = true;
  12. $message = '';
  13. foreach ($format as $field => $validation) {
  14. $valueToCheck = $value; //use the value, regardless of field.
  15. if (is_string($validation)) {
  16. // Simple string validation (e.g., length, pattern)
  17. if (preg_match($validation, $valueToCheck) === 0) {
  18. $isValid = false;
  19. $message = $field . ': Invalid format';
  20. break;
  21. }
  22. } elseif (is_array($validation)) {
  23. // Nested validation
  24. if (!is_array($valueToCheck) || !is_array($validation)) {
  25. $isValid = false;
  26. $message = $field . ': Invalid nested structure';
  27. break;
  28. }
  29. $nestedValid = true;
  30. foreach ($validation as $nestedField => $nestedValidation) {
  31. $nestedValue = $valueToCheck[$nestedField];
  32. if(!is_string($nestedValue)){
  33. $nestedValid = false;
  34. $message = $field . "." . $nestedField . ": Invalid nested value type";
  35. break;
  36. }
  37. if (preg_match($nestedValidation, $nestedValue) === 0) {
  38. $nestedValid = false;
  39. $message = $field . "." . $nestedField . ': Invalid format';
  40. break;
  41. }
  42. }
  43. if (!$nestedValid) {
  44. $isValid = false;
  45. $message = $field . "." . $nestedField . ': Invalid format';
  46. }
  47. }
  48. }
  49. if ($isValid) {
  50. $results[$key] = ['valid' => true, 'message' => 'Valid'];
  51. } else {
  52. $results[$key] = ['valid' => false, 'message' => $message];
  53. }
  54. }
  55. return $results;
  56. }
  57. // Example Usage:
  58. $data = [
  59. 'name' => 'John Doe',
  60. 'email' => 'john.doe@example.com',
  61. 'age' => 30,
  62. 'address' => [
  63. 'street' => '123 Main St',
  64. 'city' => 'Anytown',
  65. 'zip' => '12345'
  66. ],
  67. 'phone' => '555-123-4567'
  68. ];
  69. $expectedFormats = [
  70. 'name' => '^[A-Za-z ]+$', // name should be letters and spaces
  71. 'email' => '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', //email validation
  72. 'address' => [
  73. 'street' => '^[A-Za-z0-9 ]+$', // street should be letters and spaces
  74. 'city' => '^[A-Za-z ]+$', // city should be letters and spaces
  75. 'zip' => '^\d{5}$' // zip should be 5 digits
  76. ],
  77. 'phone' => '^\d{3}-\d{3}-\d{4}$' //phone number format
  78. ];
  79. $validationResults = validateNestedString($data, $expectedFormats);
  80. print_r($validationResults);
  81. ?>

Add your comment