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);
?>

如何在没有重复值的情况下用不同的值替换,我想要这样的输出:“@valuesA 是@valuesB 和@valuesC”
按顺序排列

4

3 回答 3

0

看起来您确实在尝试创建自己的 sprintf 版本:

$status = '%s are %s and %s';
$new_status = sprintf($status, '@valuesA', '@valuesB', '@valuesC');
echo $new_status;
于 2013-06-08T08:17:20.450 回答
0
$status = '@abc are @cde and @fgh';
$a1 = array('@abc', '@cde', '@fgh');
$a2 = array('@valuesA', '@valuesB', '@valuesC');

$new_status = str_replace($a1 , $a2 , $status );

使用 真的很容易str_replace,只需映射原始值和替换值。

于 2013-06-08T07:52:22.423 回答
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 算法或“ Knuth's Shuffle ”来完成,但这需要保持与初始向量大小相同的状态$values向量。因此,虽然可以做到 -这是如何做到的- 但实际上是效率低于就地版本)。

于 2013-06-08T08:00:52.317 回答