在使用PHP的getopt()之后,我怎么知道哪些参数仍然存在?

eda*_*dam 25 php getopt

好的,所以PHP有一个内置的getopt()函数,它返回有关用户提供的程序选项的信息.只是,除非我遗漏了什么,否则它完全被淹没了!从手册:

选项的解析将在找到的第一个非选项时结束,后面的任何内容都将被丢弃.

因此,getopt()返回一个仅包含有效和已解析选项的数组.您仍然可以通过查看看到整个原始命令行$argv,它仍未修改,但您如何判断该命令行中何处getopt()停止解析参数?如果您想将命令行的其余部分视为其他内容(例如,文件名),则必须知道这一点.

这是一个例子......

假设我想设置一个脚本来接受以下参数:

Usage: test [OPTION]... [FILE]...

Options:
  -a  something
  -b  something
  -c  something
Run Code Online (Sandbox Code Playgroud)

然后我可以这样打电话getopt():

$args = getopt( 'abc' );
Run Code Online (Sandbox Code Playgroud)

而且,如果我像这样运行脚本:

$ ./test.php -a -bccc file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

我应该期望将以下数组返回给我:

Array
(
    [a] =>
    [b] =>
    [c] => Array
        (
            [0] =>
            [1] =>
            [2] =>
        )
)
Run Code Online (Sandbox Code Playgroud)

所以问题是:在地球上我应该知道三个未解析的非选项FILE参数从$argv[ 3 ]??? 开始

小智 5

从 PHP 7.1 开始,getopt支持可选的 by-ref 参数,&$optind,包含参数解析停止的索引。这对于混合标志和位置参数很有用。例如:

user@host:~$ php -r '$i = 0; getopt("a:b:", [], $i); print_r(array_slice($argv, $i));' -- -a 1 -b 2 hello1 hello2
Array
(
    [0] => hello1
    [1] => hello2
)
Run Code Online (Sandbox Code Playgroud)