我需要在不重复的字符串中找到第一个字符出现的位置。到目前为止,我所有$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,我只是学习,我很感激帮助。
答案 0 :(得分: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',这是正确的。
答案 1 :(得分: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 == 1
array_filter()
)和(假设,函数是稳定的[1])取第一个。
[1]“稳定”意味着他们保持秩序。如果不是,那么你必须在$uniqueCharacters
以上找到它,然后找到第一个手动显示的那个。
$positions = array_map(
$uniqueCharacters,
functions ($character) use ($string) { return strpos($string, $character); }
);
$pos = min($positions);
echo "{$string[$pos]}:$pos";
答案 2 :(得分:0)
http://php.net/manual/en/function.strpos.php
返回针存在于相对于haystack字符串开头的位置(与offset无关)。另请注意,字符串位置从0开始,而不是1。
如果未找到针,则返回FALSE。
其次,$c = $sentence[0]
和strpos($sentence, $c)
不会让您获得有关您已经知道的更多信息。
答案 3 :(得分:0)
要在字符串中查找子字符串的位置,您应该使用strpos方法: