Skip to content

Instantly share code, notes, and snippets.

@jadb
Created October 25, 2012 01:25
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save jadb/3949954 to your computer and use it in GitHub Desktop.
Save jadb/3949954 to your computer and use it in GitHub Desktop.
Parse PHP CLI arguments
http://pwfisher.com/nucleus/index.php?itemid=45
This command line option parser supports any combination of three types of options (switches, flags and arguments) and returns a simple array.
<?php
/**
* CommandLine class
*
* @package Framework
*/
/**
* Command Line Interface (CLI) utility class.
*
* @author Patrick Fisher <patrick@pwfisher.com>
* @since August 21, 2009
* @package Framework
* @subpackage Env
*/
class CommandLine {
public static $args;
/**
* PARSE ARGUMENTS
*
* This command line option parser supports any combination of three types
* of options (switches, flags and arguments) and returns a simple array.
*
* [pfisher ~]$ php test.php --foo --bar=baz
* ["foo"] => true
* ["bar"] => "baz"
*
* [pfisher ~]$ php test.php -abc
* ["a"] => true
* ["b"] => true
* ["c"] => true
*
* [pfisher ~]$ php test.php arg1 arg2 arg3
* [0] => "arg1"
* [1] => "arg2"
* [2] => "arg3"
*
* [pfisher ~]$ php test.php plain-arg --foo --bar=baz --funny="spam=eggs" --also-funny=spam=eggs \
* > 'plain arg 2' -abc -k=value "plain arg 3" --s="original" --s='overwrite' --s
* [0] => "plain-arg"
* ["foo"] => true
* ["bar"] => "baz"
* ["funny"] => "spam=eggs"
* ["also-funny"]=> "spam=eggs"
* [1] => "plain arg 2"
* ["a"] => true
* ["b"] => true
* ["c"] => true
* ["k"] => "value"
* [2] => "plain arg 3"
* ["s"] => "overwrite"
*
* @author Patrick Fisher <patrick@pwfisher.com>
* @since August 21, 2009
* @see http://www.php.net/manual/en/features.commandline.php
* #81042 function arguments($argv) by technorati at gmail dot com, 12-Feb-2008
* #78651 function getArgs($args) by B Crawford, 22-Oct-2007
* @usage $args = CommandLine::parseArgs($_SERVER['argv']);
*/
public static function parseArgs($argv){
array_shift($argv);
$out = array();
foreach ($argv as $arg){
// --foo --bar=baz
if (substr($arg,0,2) == '--'){
$eqPos = strpos($arg,'=');
// --foo
if ($eqPos === false){
$key = substr($arg,2);
$value = isset($out[$key]) ? $out[$key] : true;
$out[$key] = $value;
}
// --bar=baz
else {
$key = substr($arg,2,$eqPos-2);
$value = substr($arg,$eqPos+1);
$out[$key] = $value;
}
}
// -k=value -abc
else if (substr($arg,0,1) == '-'){
// -k=value
if (substr($arg,2,1) == '='){
$key = substr($arg,1,1);
$value = substr($arg,3);
$out[$key] = $value;
}
// -abc
else {
$chars = str_split(substr($arg,1));
foreach ($chars as $char){
$key = $char;
$value = isset($out[$key]) ? $out[$key] : true;
$out[$key] = $value;
}
}
}
// plain-arg
else {
$value = $arg;
$out[] = $value;
}
}
self::$args = $out;
return $out;
}
/**
* GET BOOLEAN
*/
public static function getBoolean($key, $default = false){
if (!isset(self::$args[$key])){
return $default;
}
$value = self::$args[$key];
if (is_bool($value)){
return $value;
}
if (is_int($value)){
return (bool)$value;
}
if (is_string($value)){
$value = strtolower($value);
$map = array(
'y' => true,
'n' => false,
'yes' => true,
'no' => false,
'true' => true,
'false' => false,
'1' => true,
'0' => false,
'on' => true,
'off' => false,
);
if (isset($map[$value])){
return $map[$value];
}
}
return $default;
}
}
?>
Just for fun, here is a compacted version:
<?php
function parseArgs($argv){
array_shift($argv); $o = array();
foreach ($argv as $a){
if (substr($a,0,2) == '--'){ $eq = strpos($a,'=');
if ($eq !== false){ $o[substr($a,2,$eq-2)] = substr($a,$eq+1); }
else { $k = substr($a,2); if (!isset($o[$k])){ $o[$k] = true; } } }
else if (substr($a,0,1) == '-'){
if (substr($a,2,1) == '='){ $o[substr($a,1,1)] = substr($a,3); }
else { foreach (str_split(substr($a,1)) as $k){ if (!isset($o[$k])){ $o[$k] = true; } } } }
else { $o[] = $a; } }
return $o;
}
?>
@dinbrca
Copy link

dinbrca commented Oct 29, 2018

Thanks! helped a lot for some basic CLI script

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment