我正在编写一个PHP代码,它可以从Unix控制台运行,带有几个可选的开关。我在使脚本识别开关时遇到问题。
我以这种方式从控制台运行脚本
./<scriptname>.php v
希望在代码中拾取'v'开关,但它似乎不是。这是用于获取它的代码。
global $argv; // specified, but probably not needed
$verbose = array_key_exists("v", $argv); // should work but it doesn't!
// $verbose= isset($_GET["v"]); // tried, but doesn't work because it's run from console
但是尽管输出了var_dump($argv);
行:
array(2) {
[0]=>
string(21) "./<scriptname>.php"
[1]=>
string(1) "v"
}
以下行echo "\nverbose: :$verbose:\n";
输出verbose: ::
(false
)。
为什么? 非常感谢!
答案 0 :(得分:6)
"v"
是$argv
内的值,而不是键。您可以使用in_array
:
$verbose = in_array("v", $argv);
注意:in_array
执行数组内容的线性搜索,如果满足下列一个或多个条件,则可能不是最好的方法:
false
在这种情况下,这些都不是真的,所以你在这里很好。但是如果情况不同,您可以考虑使用数组的值作为另一个数组的键,以便您可以使用O(1)
而不是O(n)
的摊销成本进行检查:
// 100% safe as long as you don't mind "losing" duplicate values:
$lookup = array_fill_keys(array_keys($argv), true);
// Should be equivalent, at first sight looks safe, might be faster
// In THIS case it works just fine, but in this case you wouldn't want to
// flip the array in the first place
$lookup = array_flip($argv);
$verbose = isset($lookup["v"]);