1

我正在编写一个 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)。

为什么 ?非常感谢!

4

1 回答 1

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"]);
于 2012-04-23T11:06:20.073 回答