while循环中的多个条件PHP

问题描述:

使用布尔运算符在while循环中有多个条件的正确方法是什么? 我在这里有这个脚本,我觉得应该工作,但是当我运行它时会出现空白。while循环中的多个条件PHP

$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 $)达到双引号和它的一个未来是一个逗号。我觉得这很简单,我显然缺少一些明显的东西。

+3

所以,你要要执行的代码,如果在位置'$ i'角色既是一个逗号,而不是一个逗号? – lonesomeday

+2

我真的觉得这可能与战略性使用'preg_split'得到解决, /或'strtok'。你能描述一下你的任务,而不是你的解决方案吗? – raina77ow

+0

@lonesomeday这里用逗号作为分隔符,显然有点多余,可以重写成mak在'if'之后立即采取'$ i ++'的举措,但我认为这不是唯一的问题...... – raina77ow

如果和一边说的是相反的条件......这意味着这个永远不会有真实的。我想你想检查下一个字符?

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

     } 
    } 

} 

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

你如果要是这个角色是一个引号的语句将运行。只要这个字符不是引号(而不是逗号),while语句就会运行。

这两个是独占的。我认为你可以通过在if语句后增加$ i来解决它,但几乎肯定有一个更简单的方法。

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

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

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

你的循环内有一个逻辑缺陷,它会导致它遍历整个字符串,但没有做任何输出。

比方说:

$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 

这可能是也可能不是你正在寻找的东西。这个更详细的变体是有一个分号器/扫描器,它具有状态,一个可以做更多的事情(但是仍然具有双引号转义(""))的缺点。由于这是非常虚假的,我只有link它。这是因为假:

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

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

输出(Demo):

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

如果你有一个整个文件,看看在SplFileObject

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

删除此:(!($字符串[$ 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++; 
     } 
    } 
} 
?>