Так что я должен сделать парсер, который анализирует переданные в него аргументы командной строки. Ниже приведен код, который у меня есть.Анализ аргументов командной строки/argv
public function parse($argv = null)
{
$argv = $this->argsUnparsed;
$argvs = array();
array_shift($argvs);
foreach($argv as $arg)
{
// This is supposed to find the -- characters in a string
if(substr($arg,0,2) == '--')
{
$equals = strpos($arg, '=');
// If character in string equals '=' saving anything before it as a key and anything afterward as a value
if($equals)
{
$argvs[substr($arg,2,$equals - 2)] = substr($arg,$equals + 1);
}
else
{
$k = substr($arg,2);
if(!isset($argvs[$k]))
{
$argvs[$k] = true;
}
}
}
else if(substr($arg,0,1) == '-')
{
foreach(str_split(substr($arg,1)) as $k)
{
if(!isset($argvs[$k]))
{
$argvs[$k] = true;
}
elseif($equals == false)
{
$argvs[substr($arg,2,$equals - 2)] = substr($arg,$equals + 1);
}
}
}
else
{
$argvs[] = $arg;
}
}
return $argvs;
}
Это функция, в которой я разбираю аргументы командной строки. Моя проблема заключается в том, что, когда я вхожу "PHP testArgs.php -v -Т 4 -l знач1, val2, val3 --names = Остин, Дункан, Эдди --type = золото" печатает его, как
Array
(
[0] => testArgs.php
[v] => 1
[T] => 1
[1] => 4
[l] => 1
[2] => val1,val2,val3
[names] => Austin,Duncan,Eddie
[type] => gold
)
Второй и последний два слота массива совершенно правильные, однако остальные СЛЕДУЕТ распечатываться следующим образом.
[T] => 4
[l] => val1,val2,val3
Также первая пара значений ключа массива, [0] => testArgs.php не должна отображаться.
для одного '-', вы не проверяли позиции символа' = ', но используя те же' $ equals' переменный, которая используется внутри '--'. Кроме того, поскольку вы не используете знак '=' для аргументов '-', вам нужно будет заглянуть в следующий аргумент, чтобы узнать, начинается ли он с' -' и назначает это значение (и пропускает следующий) или 'true 'если это не так. Кроме того, это вызовет проблемы для нескольких аргументов '-', поэтому вам нужно будет сделать это только для последнего (или определить, что для него значение, оно должно быть по одному символу за раз). Чтобы это правильно работало, я предложил бы цикл for вместо foreach. –
Кроме того, в чем смысл аргумента '$ argv', который вы передаете в функцию, если первое, что вы делаете в этой функции, перезаписывает ее с помощью' $ this-> argsUnparsed'? Либо избавиться от аргумента функции, либо потерять строку, которая перезаписывает аргумент и использует то, что передается. Я бы предложил последнее просто потому, что тогда ваша функция не полагается на то, что она находится в этом классе и может быть использована в другом месте. –