1

ブール演算子を使用して while ループに複数の条件を含める正しい方法は何ですか? ここにこのスクリプトがあり、動作するはずですが、実行すると空白になります。

$string = '"""JOHN"" <31255555656>","DAHDI/1-1",3948723,,"",';

for ($i=0; $i<strlen($string); $i++) { 
    if ($string[$i] == chr(34)) {   
        // chr 34 is ascii value for double quote chr 44 is for comma 
        while (($string[$i] != chr(34)) && ($string[$i+1] != chr(44))) {
            echo $string[$i];
            $i++;
        }
    }

}

理想的には、ポインター ($i) が二重引用符に達し、その前にコンマがあるまで、スクリプトが指定された文字列をエコーすることです。これは非常に単純で、明らかな何かが明らかに欠けているように感じます。

4

5 に答える 5

1
if ($string[$i] == chr(34)) {   
    while (($string[$i] != chr(34)) && ($string[$i+1] != chr(44))) 

この文字が引用符の場合、if ステートメントが実行されます。while ステートメントは、この文字が引用符ではない (およびコンマでない) 限り実行されます。

2つは排他的です。if ステートメントの後に $i をインクリメントすることで回避できると思いますが、これを行う簡単な方法がほぼ確実にあります。

于 2012-09-17T17:00:12.080 に答える
0

ループ内に論理的な欠陥があり、文字列全体を反復処理しますが、何も出力しません。

まあ言ってみれば:

$a = 1;
$b = 1;

while ($a == 1)
{
    while ($a != 1 && $b == 1)
    {
         # will never come here.
    }

    $a++;
}

$a決してあり得ないと1同時に!1、お互いの中に入れた条件が自分自身をブロックしているからです。

これを解決する一般的な方法の 1 つは、文字列をトークン化 (文字列をスキャン) してからトークンを処理することです。

$string = '"""JOHN"" <31255555656>","DAHDI/1-1",3948723,,"",';

$token = strtok($string, '"');

while ($token !== false)
{
    $token[0] !== ',' && (print "$token\n");

    $token = strtok('"');
}

これにより、次の出力が生成されます ( Demo )。

JOHN
 <31255555656>
DAHDI/1-1

あなたが探しているものかもしれないし、そうでないかもしれません。これのより詳細な変種は、より多くのことができるstateを持つトークナイザー/スキャナーを用意することです (ただし、引用符を 2 倍 ( ) することでエスケープするという欠点があり""ます)。これはかなり偽物なので、リンクするだけです。次の理由により、偽物です。

あなたが探している実際の関数は呼び出されstr_getcsvます:

$string = '"""JOHN"" <31255555656>","DAHDI/1-1",3948723,,"",';
echo implode("\n", str_getcsv($string));

出力 (デモ):

"JOHN" <31255555656>
DAHDI/1-1
3948723

ファイル全体がある場合は、SplFileObject.

于 2012-09-17T17:42:53.347 に答える
0

内側のループは文字列の最後で終了しません。

ループ内でループ制御変数 ($i) を操作すると、コードが難しくなります。それについて推論し、それが正しいかどうかを確認するのがはるかに難しくなります。避けるべきです。

文字列を 1 文字ずつ移動するループが 1 つしかない場合は、より良い構造が得られます。$inside_quotes などの変数を使用して状態を記憶するよりも。

于 2012-09-17T17:13:45.327 に答える
0

if と while は反対の条件を示しています... つまり、while は true になることはありません。次のキャラクターを確認したかったのですか?

$string = '"""JOHN"" <31255555656>","DAHDI/1-1",3948723,,"",';

for ($i=0; $i<strlen($string); $i++)
{ 

if ($string[$i] == chr(34)) 

    {   
        while (($string[$i+1] != chr(34)) && ($string[$i+1] != chr(44)))  // notice the $i+1
// chr 34 is ascii value for double quote chr 44 is for comma 

        {
             echo $string[$i];
             $i++;

        }
    }

}
于 2012-09-17T16:59:22.043 に答える