array_key_exists对$ argv无法正常工作?

Tom*_*ala 1 php unix

我正在编写一个PHP代码,它可以从Unix控制台运行,带有几个可选的开关.我在使脚本识别开关时遇到问题.

我这样从控制台运行脚本

./<scriptname>.php v
Run Code Online (Sandbox Code Playgroud)

希望在代码中拾取'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
Run Code Online (Sandbox Code Playgroud)

但是,尽管线路var_dump($argv);输出:

array(2) {
  [0]=>
  string(21) "./<scriptname>.php"
  [1]=>
  string(1) "v"
}
Run Code Online (Sandbox Code Playgroud)

以下行echo "\nverbose: :$verbose:\n";输出verbose: ::(即false).

为什么?非常感谢!

Jon*_*Jon 6

"v"是一个内在的价值$argv,而不是一个关键.您可以通过以下方式检查in_array:

$verbose = in_array("v", $argv);
Run Code Online (Sandbox Code Playgroud)

注意: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"]);
Run Code Online (Sandbox Code Playgroud)

  • @DaveRandom:IMO`array_key_exists`和`isset`如果密钥存在但相关值为'null`则不同.你可能会关心这种差异(过去我有理由关心). (2认同)