-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 を echo すると、その値が「l」になるからです。したがって、その値を strpos で使用すると、正しい位置が得られると思いました。したがって、この最初の非繰り返し文字位置を抽出する方法について助けを得るために、StackOverlow に正しい方向を示すように依頼すると思いました。くそくらえる必要はありません。私はただ学んでいるだけです。助けていただければ幸いです。

4

4 に答える 4

2

あなたのコードはほぼ正しいです。テストしたところ、「m: 0」が表示されました。これは、実際に 1 回しか表示されない最初の文字です。位置が 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 == 1in array_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

干し草の山文字列の先頭に対する針の位置を返します (オフセットとは関係ありません)。また、文字列の位置は 1 ではなく 0 から始まることに注意してください。

針が見つからなかった場合は 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 に答える