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 语句就会运行

两者是排他性的。我认为您可以通过在 if 语句之后增加 $i 来解决它,但几乎可以肯定有一种更简单的方法可以做到这一点。

于 2012-09-17T17:00:12.080 回答
0

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

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

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

于 2012-09-17T17:13:45.327 回答
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++;

        }
    }

}
于 2012-09-17T16:59:22.043 回答
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的分词器/扫描器,它可以做更多的事情(但仍然存在通过将 ( ) 加倍来转义引号的缺点"")。由于这是非常虚假的,我只链接它。这是假的,因为:

您正在寻找的实际功能称为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

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

删除这个: (($string[$i] != chr(34)) && 以及额外的 ) 代码将产生以下内容: """JOHN"" <31255555656>"DAHDI/1-1"

<?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++;
        }
    }
}
?>
于 2017-11-27T21:36:10.987 回答