2014-07-10 122 views
-1

$ target是一個字符,我正試圖在$ line中查找該字符的最後一次出現。即使我確定某個索引處的$ line在$ line內存在,我也會爲每個輸出獲得-1。strrpos不會評估某些字符串

$fh = fopen($someFile, "r"); 
    while (!feof($fh)) { 
    $test = fgets($fh); 
    $words = explode(",", $test); 
    $line = $words[0]; 
    $target = $words[1]; 

    $answer = strrpos($line, $target); 

    if ($answer !== false) { 
    echo $answer; 
    } 
    else echo -1; 
    echo "\n"; 
    } 

此代碼爲每個單值返回-1。如果我在strrpos函數中將$行更改爲$ test,它可以每次找到索引。我檢查了$行,以確保它不是空的,它實際上是字符串的第一部分。爲什麼這不起作用?

+0

您在哪裏設置'$ answer'? –

+0

可能'$ answer = strrpos($ words [0],$ words [1]);'...... – MarcoS

+0

@MarcoS好吧,如果他忘記了真的這麼做,他確實總是會得到-1 –

回答

0

我不知道如果我沒有正確地理解你的答案......但是,你有一些錯誤,在你的代碼:

1)您沒有指派strrpos至$回答的結果(可能只是一個錯字...)。
2)你的測試函數結果爲-1,但是如果沒有找到匹配,該函數返回FALSE。

這應該工作:

<?php 
    $someFile = "data"; 
    $fh = fopen($someFile, "r"); 
    while (!feof($fh)) { 
    $test = fgets($fh); 
    $words = explode(",", $test); 
    $line = $words[0]; 
    $target = $words[1]; 

    $answer = strrpos($line, $target); 
    if ($answer !== FALSE) { 
     echo $answer; 
    } else { 
     echo -1; 
    } 
    echo "\n"; 
    } 
?> 

有了這些數據文件:

haystack,stack, 

此代碼打印:

3 

按理說它是你正在尋找答案.. 。

Bef礦石要生產(:-)你也應該知道:

    上與fgets
  • FEOF()應檢查與fgets(),而不是之前...
  • 總是使用印章()( )的,以避免換行的問題(與fgets返回換行,太...)

UPDATE
爲了更好地體現你的使用情況(我希望),並執行所有建議我寫的在評論中,這裏是更新版本的workinkg代碼。請發表您的數據,如果仍然要爲你不工作...

文件 「test.php的 」:

<?php 
    $someFile = "data"; 
    $fh = fopen($someFile, "r"); 
    while (1) { 
    $test = fgets($fh); 
    if (feof($fh)) break; 
    $test = chop($test); 
    $words = explode(",", $test); 
    $line = $words[0]; 
    $target = $words[1]; 

    $answer = strrpos($line, $target); 
    if ($answer !== FALSE) { 
     echo $answer; 
    } else { 
     echo -1; 
    } 
    echo "\n"; 
    } 
?> 

文件「 數據」:

haystack,s 

運行:

$ php test.php 
3 
+0

謝謝你對我的錯字和額外的建議。在將一些Java解謎解決方案轉換爲PHP並獲得更多練習的過程中。即使我知道$ line中存在$ target,我仍然會爲每個具有此確切代碼的答案獲得-1。 $ target是單個字符,我試圖在$ line中找到該字符的最後一次出現,如果該信息有幫助的話。我真的不明白爲什麼它不會拿起第一個if語句。 – STLCards77

+0

你能發佈你的數據文件嗎? – MarcoS

0

它是不潔的你在問什麼。爆炸不會將第二個元素放入第一個元素中,就像您在問題中所暗示的那樣。此外,在您的問題中,您在if()中評估$answer,但您不會在您向我們展示的代碼中的任何位置設置$answer

但我只想澄清:

$string = "abcd,efghij,kl"; 
$array = explode(",",$string); 
echo $array[0]; // abcd 
echo $array[1]; // efghij 
echo $array[2]; // kl 

如果你需要知道有多大的任何元素都是,或者在接下來的元素開始,只需使用strlen()

echo strleng($array[0]); // 4 
echo strleng($array[1]); // 6 
echo strleng($array[2]); // 2 

由於$array[0]是4個字符長,我們後面有一個逗號,$array[1]從索引4 + 1 = 5開始。

$array[2]開始於索引12,因爲前2個元素帶有2個逗號是4 + 1 + 6 + 1 = 12.

+0

那麼這是否回答你的問題? –