PHP循环中的多个条件

时间:2012-09-17 16:54:42

标签: php while-loop conditional-statements boolean-operations multiple-conditions

使用布尔运算符在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)到达双引号并且前面的一个是逗号。我觉得这很简单,我显然错过了一些明显的东西。

5 个答案:

答案 0 :(得分:1)

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

如果此字符是引用,则会运行if语句。只要此字符不是引号(并且不是逗号),while语句就会运行

这两个是独家的。我想你可以通过在if语句之后递增$ i来绕过它,但几乎可以肯定这样做更容易。

答案 1 :(得分:0)

if和while表示相反的条件......这意味着while将永远不会有真实。我想你想检查下一个角色?

$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++;

        }
    }

}

答案 2 :(得分:0)

内部循环不会在字符串的末尾结束。

在循环内操作循环控制变量($ i)会导致代码困难。 这使得理由更难,并检查它是否正确。 你应该避免它。

如果只有一个循环在一个接一个地逐个字符串中移动,那么你会得到一个更好的结构。比使用变量来记住状态,例如$ inside_quotes。

答案 3 :(得分:0)

你的循环中有一个逻辑缺陷会导致它迭代整个字符串但没有做任何输出。

让我们说:

$a = 1;
$b = 1;

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

    $a++;
}

由于$a永远不会是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 的标记器/扫描器,一个可以做得更多的标记器/扫描器(但仍然有一个缺点,就是加倍引号的转义("" )他们)。由于这是非常虚假的,我只link。这是假的,因为:

您正在寻找的实际功能称为str_getcsv

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

输出(Demo):

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

如果您有整个文件,请查看SplFileObject

答案 4 :(得分:0)

由于您已经使用for语句找到了第一个引号,因此您不需要使用for语句再次找到相同的引号。

删除此:(($ string [$ i]!= chr(34))&amp;&amp;&amp;&);代码将产生以下内容: &#34;&#34;&#34; JOHN&#34;&#34; &LT; 31255555656&GT;&#34; DAHDI / 1-1&#34;

<?php
$string = '"""JOHN"" <31255555656>","DAHDI/1-1",3948723,,"",';
for ($i=0; $i<strlen($string); $i++) { 
    if ($string[$i] == chr(34)) {
        while  ($string[$i+1] != chr(44)) {
            echo $string[$i];
            $i++;
        }
    }
}
?>