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 $)达到双引号和它的一个未来是一个逗号。我觉得这很简单,我显然缺少一些明显的东西。
如果和一边说的是相反的条件......这意味着这个永远不会有真实的。我想你想检查下一个字符?
$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++;
}
}
}
?>
所以,你要要执行的代码,如果在位置'$ i'角色既是一个逗号,而不是一个逗号? – lonesomeday
我真的觉得这可能与战略性使用'preg_split'得到解决, /或'strtok'。你能描述一下你的任务,而不是你的解决方案吗? – raina77ow
@lonesomeday这里用逗号作为分隔符,显然有点多余,可以重写成mak在'if'之后立即采取'$ i ++'的举措,但我认为这不是唯一的问题...... – raina77ow