1. <?php
  2. /**
  3. * Deserializes command-line options and performs basic validation.
  4. *
  5. * @param array $argv Array of command-line arguments.
  6. * @return array Associative array of validated options. Returns an empty array on error.
  7. */
  8. function deserializeOptions(array $argv): array
  9. {
  10. $options = [];
  11. $valid = true;
  12. // Use array_filter to process options. Ignore script name and path.
  13. $optionArgs = array_filter($argv, function ($arg) {
  14. return $arg !== $argv[0] && strpos($arg, '-') === 0;
  15. });
  16. foreach ($optionArgs as $arg) {
  17. // Split the option into name and value
  18. $parts = explode('=', $arg, 2);
  19. if (count($parts) !== 2) {
  20. echo "Error: Invalid option format: $arg\n";
  21. $valid = false;
  22. continue; //skip to next option
  23. }
  24. $optionName = strtolower($parts[0]);
  25. $optionValue = trim($parts[1]);
  26. // Basic validation based on option name
  27. switch ($optionName) {
  28. case 'name':
  29. if (empty($optionValue)) {
  30. echo "Error: Option --name requires a value.\n";
  31. $valid = false;
  32. break;
  33. }
  34. $options['name'] = $optionValue;
  35. break;
  36. case 'age':
  37. if (!is_numeric($optionValue)) {
  38. echo "Error: Option --age requires a numeric value.\n";
  39. $valid = false;
  40. break;
  41. }
  42. $age = (int)$optionValue;
  43. if ($age < 0 || $age > 150) {
  44. echo "Error: Option --age must be between 0 and 150.\n";
  45. $valid = false;
  46. break;
  47. }
  48. $options['age'] = $age;
  49. break;
  50. case 'email':
  51. if (!filter_var($optionValue, FILTER_VALIDATE_EMAIL)) {
  52. echo "Error: Option --email is not a valid email address.\n";
  53. $valid = false;
  54. break;
  55. }
  56. $options['email'] = $optionValue;
  57. break;
  58. default:
  59. echo "Error: Unknown option: $optionName\n";
  60. $valid = false;
  61. break;
  62. }
  63. }
  64. if (!$valid) {
  65. return []; // Return empty array if any error occurred.
  66. }
  67. return $options;
  68. }
  69. ?>

Add your comment