2012-04-23 32 views
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)。

为什么? 非常感谢!

回答

6

"v"内部,而不是一个键。您可以检查它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"]); 
+0

卫生署!谢谢。 – TomaszRykala 2012-04-23 11:08:06

+1

除此之外,我不明白为什么会使用'array_key_exists()'''isset($ array [$ key])'是相同的并且快得多(他说,微优化) – DaveRandom 2012-04-23 11:08:40

+0

感谢您的提示@DaveRandom。 – TomaszRykala 2012-04-23 11:11:00