因此,我必須製作一個解析器來解析傳遞給它的命令行參數。以下是我迄今爲止的代碼。通過命令行參數進行解析/ 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 -T 4 -l VAL1,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。 –
另外,如果您在函數中做的第一件事是用'$ this-> argsUnparsed'覆蓋它,那麼將參數'$ argv'傳遞給函數有什麼意義?要麼擺脫函數的參數,要麼丟掉覆蓋參數的行,並使用傳入的行。我建議後者只是因爲那時你的函數不依賴於它在該類中,並且可以在其他地方使用。 –