2011-12-22 10 views
0

私はここに問題があります。経験豊富なプログラマーが、どの方が望ましい解決策であるかを尋ねています。文字列が二重引用符で囲まれたPHP Switchステートメント

引用符で囲まれた値が返されています。 "TOTAL"および"VALUE"は2つの例である。これらは、TOTALVALUEと混同してはなりません。文字列は実際には二重引用符で囲まれています。

私が気づいたことは、TOTALない"TOTAL"を探しているので、以下のswitch文が動作しないということである。

switch ($statTypeName) { 
    case "TOTAL": 
     echo "<br>TOTAL"; 
     break; 
    case "VALUE": 
     echo "<br>VALUE"; 
     break; 
} 

この作業を取得するために、私はケースの周りに単一引用符を入れていた - '"TOTAL"' 。 私のテキストエディタ(Notepad ++)では、二重引用符を一重引用符で囲むのは難しいです。

これはよくある問題ではありませんが、これを解決する「プロフェッショナルな」方法は何でしょうか?私がやったやり方、あるいは引用符で囲まれた文字列から文字列を抜き出し、二重引用符で囲まなければならないのでしょうか?

ありがとうございます!

答えて

1

あなたがやっていることは確かに一般的です。あなたがそれをやっているやり方に間違っていることは何もない、@ KyleBanksの解決法(二重引用符をエスケープする)。 phpが一重引用符と二重引用符の定義を提供する場合、私は最初を好む。しかし、それはあなたの好み、またはあなたの開発チームまでです。

文字列引用符内の部分文字列を抽出する限り、最初の場所にあるものに依存します。

+0

私はファイルを解析しているので、元の著者は値を引用符で囲むことを意図していました。私はそれを支配していない、私が解析する方法のみ:)。二重引用符で囲まれた文字列を一重引用符で囲みます。ありがとう! – pr0tocol

+0

あなたのプログラムの目的のために引用符を必要としないならば、それらのまわりを解析して、あなたのコードの引用符で作業するのを避けることができますか? –

2
case "\"TOTAL\"": 

内側の二重引用符をエスケープします。それは同じように動作し、読者にはもう少し見えるかもしれません。

1

私はNotepad ++でより良いフォントを使用することをお勧めします。私は個人的にあなたが他の良いオプションのヒープを見つけることができますが、ここでConsolasを使用します示唆されたように引用符をエスケープ Recommended Fonts for Programming?

その他、その後変更フォントは別の代替です:

case "\"TOTAL\"": 

あなたはまた、引用符を除去しようとすることができます。

switch (substr($statTypeName, 1, -1)) {...} 
switch (substr($statTypeName, 1, -1)) {...} 

しかし、私はより複雑なコードを使用してチェックをしてから、それが明らかに過労になるようなことがない限り、より危険なアプローチだと考えています。

+1

スイッチ(trim($ statTypeName、 '"')){...}はよりクリーンで、はるかに危険です –

+0

これは良いコメントです、私はトリムの2番目のパラメータについて知りませんでした –

0

あなたのコードが何らかの種類のStatTypeクラスの一部ではなく、stat型状態の表現を内部的に扱っている場合を除いて、私の答えには少し欠点があるかもしれませんが、いずれの場合もそうです。

実際にあなたはここで何か間違っているとあなたが求めていることは、あなたが持つ本質的な問題を回避する方法を見つけることです。代わりに、本質的な問題を解決する必要があります。

重要な問題は、あなたがあなたのstatTypeを表す方法とそれを使用する方法の間にある抽象化のレイヤーが欠けていることです。

あなたstatTypeを呼ぶのであれば、あなたのプログラムは気にしないでください。

"TOTAL" や ' "TOTAL"' や "合計" または "総"

をあなたがするために必要なものあなたのstatTypeがプログラム実行のある瞬間に特定の状態にあることに注意してください。どのように状態の表現が実装されているか(引用符または数字の文字列)は実装の詳細であり、switch文はそれを気にするべきではありません。

たとえば、statTypeNameを引用符なしに変更するとどうなりますか?引用符を付けてそれに依存するコードのすべての行に移動し、それを変更する必要があります。実装の詳細を何らかの形で隠す場合は、複数行のコードを変更する必要はありません。

statTypesを抽象化するためのアプローチは? (分かりやすくするために簡略化)

class StatType 
{ 
    const TOTAL = 0; 
    const VALUE = 1; 
    // etc. 
} 

switch ($statType->type()) { 
    case StatType::TOTAL: 
     echo "<br>TOTAL"; 
     break; 
    case StatType::VALUE: 
     echo "<br>VALUE"; 
     break; 
} 
関連する問題