0
<?php
$status = '@abc are @cde and @fgh';
$values = array("@valuesA", "@valuesB", "@valuesC");
echo $status = preg_replace_callback("/(\s+|^)@\S+/", function($matches) use ($values) { return $values[array_rand($values)]; }, $status);
?>

値を繰り返さずに別の値に置き換えるにはどうすればよいですか。次のような出力が必要です

4

3 に答える 3

0

最も簡単な方法は、を使用することshuffleです。このように、値の数は同じままで、繰り返しはありません。

$status = '@abc are @cde and @fgh';
$values = array("@valuesA", "@valuesB", "@valuesC");

shuffle($values);

単純な文字列置換でさらに良くなります:

$xlat = array(
    '@abc'   => $valueA,
    '@cde'   => $valueB,
...);

$result = str_replace(array_keys($xlat),
                      shuffle(array_values($xlat)),
                      $status);

(私は当初、これは Durstenfeld アルゴリズムまたは「クヌースのシャッフル」を実装して実行できると信じていましたが、これには初期ベクトルと同じサイズの状態ベクトルを維持する必要があり$valuesます。したがって、それを実行することはできますが (方法は次のとおりです)、実際にはインプレース バージョンよりも効率が悪い)

于 2013-06-08T08:00:52.317 に答える