【问题标题】:strrpos wont evaluate certain stringsstrrpos 不会评估某些字符串
【发布时间】:2014-07-10 07:28:07
【问题描述】:

$target 是一个字符,我试图在 $line 中找到该字符的最后一次出现。即使我确定 $target 确实存在于 $line 中的某个索引处,我也会为每个输出得到 -1。

    $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 函数中将 $line 更改为 $test ,它每次都可以找到索引。我检查了 $line 以确保它不为空,它实际上是字符串的第一部分。为什么这不起作用?

【问题讨论】:

  • 你在哪里设置$answer
  • 可能是$answer = strrpos ($words[0], $words[1]); ...
  • @MarcoS 好吧,如果他忘记实际这样做,他确实总是会得到 -1
  • 好吧,即使是 -1,如果没有找到匹配项,strrpos 将返回 FALSE...
  • @MarcoS 他总是会得到-1,因为他只是用else echo -1; 声明if() 永远不会是真的。

标签: php string strpos


【解决方案1】:

不清楚你在问什么。 Explode 不会将第二个元素放在第一个元素中,就像您在问题中建议的那样。同样在您的问题中,您在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。

【讨论】:

  • 那么这是否回答了您的问题?
【解决方案2】:

我不知道我是否正确理解了您的答案...但是,您的代码中有一些错误:

1) 您没有将 strrpos 的结果分配给 $answer(可能只是一个错字...)。
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

这应该是您正在寻找的答案...

在投入生产之前 (:-),您还应该注意:

  • feof() 应该检查之后 fgets(),而不是之前...
  • 始终在 fgets() 上使用 Chop(),以避免换行问题(fget 也返回换行...)

更新
为了更好地反映您的用例(我希望如此),并实施我在 cmets 中编写的所有建议,这里是 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

【讨论】:

  • 感谢您原谅我的错字并提供额外建议。在将一些 Java 拼图解决方案转换为 PHP 的过程中并获得更多实践。即使我知道 $target 存在于 $line 中,使用此确切代码的每个答案我仍然会得到 -1。 $target 是单个字符,如果该信息有帮助,我将尝试在 $line 中找到该字符的最后一次出现。我真的不明白为什么它不会选择第一个 if 子句。
  • 您可以发布您的数据文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2020-04-20
  • 1970-01-01
相关资源
最近更新 更多