1

オプションのスイッチをいくつか使用して、Unix コンソールから実行するための php コードを作成しています。スクリプトにスイッチを認識させるのに問題があります。

この方法でコンソールからスクリプトを実行します

./<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"キーではなく、内部のです。あなたはそれをチェックすることができます:$argvin_array

$verbose = in_array("v", $argv);

注:in_array配列の内容の線形検索を実行します。これは、次の条件の1つ以上が当てはまる場合に最適な方法ではない可能性があります。

  • あなたはそれをループの中で呼んでいます
  • 配列が長い
  • かなりの数の小切手が返されると予想します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 に答える