-4

我需要在不重复的字符串中找到第一个字符出现的位置。到目前为止,我有我的$pos输出0

<?php
$sentence = "some long string";
$found = false;

while(!$found && $sentence!== ""){
  $c = $sentence[0];
  $count = substr_count($sentence,$c);

  if ($count == 1) $found = true;
  else $sentence = str_replace($c,"",$sentence);
}
$pos = strpos($sentence, $c);
echo "$c: $pos";

它会输出l:0. 那是怎么回事?

我知道这$pos = strpos($sentence, $c);不是找到位置的正确方法。为什么我很困惑,当我回显 $c 时,它的值是“l”。所以,我想如果我在 strpos 中使用它的值,它会给我正确的位置。因此,为了获得有关如何提取第一个非重复字符位置的帮助,我想我会在 StackOverlow 上要求我指出正确的方向。不必是 d**ks,我只是在学习,我很感激帮助。

4

4 回答 4

2

您的代码几乎是正确的。当我测试它时,我得到了'm:0',这确实是第一个只出现一次的字符。位置为 0 的原因是您每次尝试新字符时都在缩小原始字符串。

我建议您在开始在其中查找字符之前复制字符串,然后使用副本来计算末尾的位置,而不是缩小的字符串。

<?php
$sentence = "some long string";
$sentence_copy = $sentence;
$found = false;

while(!$found && $sentence!== ""){
  $c = $sentence[0];
  $count = substr_count($sentence,$c);
  if ($count == 1) $found = true;
  else $sentence = str_replace($c,"",$sentence);
}

$pos = strpos($sentence_copy, $c);
echo "$c: $pos";

这给了我'm:2',这是正确的。

于 2012-09-13T20:25:48.033 回答
1

关于评论

我需要找到不重复的第一个字符的位置。

<?php
$numberOfOccurences = array_count_values(str_split($string, 1));
$uniqueCharacters = array_keys(
    array_filter($numberOfOccurences, function($c) { return $c == 1; })
);
echo $uniqueCharacters[0] . ':' . strpos($string, $uniqueCharacters[0]);

这个想法很简单,我们不将字符串视为字符串,而是将字符串视为一组字符,计算每个字符,然后只保留出现一次的字符($c == 1array_filter())和(假设函数是稳定的 [1] ) 拿第一个。

[1] “稳定”的意思是,他们保持秩序。如果不是,您必须遍历$uniqueCharacters并找到首先手动出现的那个。

$positions = array_map(
    $uniqueCharacters,
    functions ($character) use ($string) { return strpos($string, $character); }
);
$pos = min($positions);
echo "{$string[$pos]}:$pos";
于 2012-09-13T20:09:24.200 回答
0

http://php.net/manual/en/function.strpos.php

返回针相对于 haystack 字符串开头的位置(与偏移量无关)。另请注意,字符串位置从 0 开始,而不是 1。

如果未找到针头,则返回 FALSE。

其次,$c = $sentence[0]不会strpos($sentence, $c)让你获得更多关于你已经知道的信息。

于 2012-09-13T19:19:16.690 回答
0

要在字符串中查找子字符串的位置,您应该使用 strpos 方法:

http://www.php.net/manual/en/function.strpos.php

于 2012-09-13T19:19:27.090 回答