0

非常に単純なコード スニペットを設定しました。

$string = 'Some random words. Some more random, very random words.';
$words = explode(" ", $string);

for ($i = 0; $i < count($words); $i++) {
    $word = $words[$i];
    $words[$i] = str_replace(".", "!", $word);
    $words[$i] = str_replace(",", "?", $word);
}

print_r($words);

出力は次のとおりです。

Array
(
    [0] => Some
    [1] => random
    [2] => words.
    [3] => Some
    [4] => more
    [5] => random?
    [6] => very
    [7] => random
    [8] => words.
)

2 番目の関数だけがstr_replace()文字列に影響するのはなぜですか? 2番目を削除するとstr_replace()、最初のものは完全に機能します。の使用法ではありstr_replace()ませんが、非常に単純に間違ったことをしていると思います。

ちなみに、私はpreg_replace()配列を認識して渡してstr_replace()いますが、この特定の状況について聞きたいです:)。

編集: 迅速な対応に感謝します。私はそのような問題を恥じていますが、最初は本当に目を引きませんでした. みんな、ありがとう!Mike Brant さんによる最初の正解を受け入れます。

4

3 に答える 3

4

これは、最初の置換後に文字列を割り当てた場所では$wordなく、2 番目のステートメントが置換の対象として使用されているためです。$words[$i]

時間全体を直接操作するか$words[$i]、一時変数のみを操作してから、次のように割り当てを行うことで修正できます。

for ($i = 0; $i < count($words); $i++) {
    $word = $words[$i];
    $word = str_replace(".", "!", $word);
    $words[$i] = str_replace(",", "?", $word);
}
于 2013-01-16T16:51:05.927 に答える
2

str_replace同じ文字列に何度も申請していたからです。新しい文字列を (置換された文字で) 再割り当てし、更新された値に対して別の置換を実行する必要があります

for ($i = 0; $i < count($words); $i++) {
    $word = $words[$i];  //initial value
    $word = str_replace(".", "!", $word);  //change $word to modified text
    $word = str_replace(",", "?", $word);  //change $word to modified text
    $words[$i] = $word;
}

値は$wordによって変更されないためstr_replace、同じままです。それを変更するには、戻り値/結果を割り当てる必要がありますstr_replace

于 2013-01-16T16:51:51.437 に答える
1

への変更:

for ($i = 0; $i < count($words); $i++) {        
    $words[$i] = str_replace(".", "!", $words[$i]);
    $words[$i] = str_replace(",", "?", $words[$i]);
}

さらに短い:

for ($i = 0; $i < count($words); $i++) {        
    $words[$i] = str_replace(array(".", ","), array("!", "?"), $words[$i]);        
}
于 2013-01-16T16:50:19.810 に答える