<?php
class OptionParser {
private $options = [];
public function addOption($short, $long, $type = null, $default = null, $description = null, $options = []) {
// Store option details.
$this->options[$short] = [
'long' => $long,
'type' => $type,
'default' => $default,
'description' => $description,
'options' => $options, // For nested options
];
}
public function parse($args) {
$parsed = [];
$args_copy = $args; //copy to avoid modifying original args
$i = 0;
while ($i < count($args_copy)) {
$arg = $args_copy[$i];
if ($arg[0] === '-') {
$short = $arg[1];
if (isset($this->options[$short])) {
$option = $this->options[$short];
if (isset($args_copy[$i + 1])) {
$value = $args_copy[$i + 1];
if ($option['type'] === 'bool') {
$parsed[$short] = (bool) $value; // Convert to boolean
} else {
$parsed[$short] = $value;
}
$i += 2; // Consume option and value
} else {
if (isset($option['default'])) {
$parsed[$short] = $option['default'];
} else {
throw new Exception("Missing value for option: --$short");
}
$i++;
}
} else {
throw new Exception("Unknown option: --$short");
}
} else {
$parsed[] = $arg; // Non-option arguments
$i++;
}
}
return $parsed;
}
}
// Example Usage:
$parser = new OptionParser();
$parser->addOption('a', 'enable-feature', 'bool', false, 'Enable a feature', []);
$parser->addOption('v', 'verbose', 'bool', false, 'Enable verbose output', []);
$parser->addOption('l', 'log-file', null, null, 'Specify the log file', ['path' => '']);
$parser->addOption('n', 'num-iterations', 'int', 10, 'Number of iterations', []);
$arguments = ['-a', '-v', '--log-file', 'my_log.txt', '-n', '20'];
try {
$parsed_args = $parser->parse($arguments);
print_r($parsed_args);
echo "enable_feature: " . ($parsed_args['a'] ? 'true' : 'false') . "\n";
echo "verbose: " . ($parsed_args['v'] ? 'true' : 'false') . "\n";
echo "log_file: " . $parsed_args['log-file'] . "\n";
echo "num_iterations: " . $parsed_args['num-iterations'] . "\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
?>
Add your comment