2012-04-23 3 views
1

저는 몇 가지 옵션 스위치로 유닉스 콘솔에서 실행되는 PHP 코드를 작성하고 있습니다. 스크립트에서 스위치를 인식하는 데 문제가 있습니다.

나는, 그러나으로 표시되지 않습니다, 콘솔에서 'V'스위치 코드에서 포착 될 것으로 기대 이런 식으로

./<scriptname>.php 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); 출력 불구

( false이다)

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

다음 줄 echo "\nverbose: :$verbose:\n"; 출력 verbose: ::.

왜? 많은 감사!

답변

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"]); 
+0

찰흙을! 고맙습니다. – TomaszRykala

+1

이것에 더해서 나는 왜 왜 array_key_exists()를 사용하는지 알지 못한다 -'isset ($ array [$ key])'는 동일하고 훨씬 빠르다 (그는 마이크로 최적화라고 말했다) – DaveRandom

+0

팁 @DaveRandom을 가져 주셔서 감사합니다. – TomaszRykala

관련 문제