1

使用布爾運算符在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

回答

0

如果和一邊說的是相反的條件......這意味着這個永遠不會有真實的。我想你想檢查下一個字符?

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

     } 
    } 

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

你如果要是這個角色是一個引號的語句將運行。只要這個字符不是引號(而不是逗號),while語句就會運行。

這兩個是獨佔的。我認爲你可以通過在if語句後增加$ i來解決它,但幾乎肯定有一個更簡單的方法。

0

內部循環不會結束在字符串的末尾。

在循環內操作循環控制變量($ i)會導致代碼難以處理。 這使得更難推理它,並檢查它是否正確。 你應該避免它。

如果您只有一個循環通過字符串逐個字符地移動,您將獲得更好的結構。比使用變量記住一個狀態,例如$ inside_quotes。

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 

這可能是也可能不是你正在尋找的東西。這個更詳細的變體是有一個分號器/掃描器,它具有狀態,一個可以做更多的事情(但是仍然具有雙引號轉義(""))的缺點。由於這是非常虛假的,我只有link它。這是因爲假:

你正在尋找的實際功能被稱爲str_getcsv

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

輸出(Demo):

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

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

0

由於您已經找到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++; 
     } 
    } 
} 
?>