<?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” 按顺序
答案 0 :(得分: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
非常简单,只需映射原始值和替换值。
答案 1 :(得分: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 ”完成,但这需要维护与初始{相同>的状态向量。 {1}}向量。所以,当可以完成 - here's how - 时,它实际上 效率低于就地版本。)< / p>
答案 2 :(得分:0)
您似乎正在尝试创建自己的sprintf版本:
$status = '%s are %s and %s';
$new_status = sprintf($status, '@valuesA', '@valuesB', '@valuesC');
echo $new_status;