2014-07-10 154 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

那么这是否回答你的问题? –