PHP:如何在随机替换术语的同时遍历字符串?
我有一个字符串,它是这样一段文本:PHP:如何在随机替换术语的同时遍历字符串?,php,arrays,random,Php,Arrays,Random,我有一个字符串,它是这样一段文本: $input = AAAA BBBB CCCC DDD E FFFF GGG AAAA HHHH IIII JJJ KKKK $terms[0][0] = "AAAA"; $terms[0][1] = "KKKK"; $terms[0][2] = "A2A2"; $terms[1][0] = "FFFF"; $terms[1][1] = "TTT"; $terms[1][2] = "FFF1"; $replace_pairs[AAAA] = "KKKK";
$input = AAAA BBBB CCCC DDD E FFFF GGG AAAA HHHH IIII JJJ KKKK
$terms[0][0] = "AAAA";
$terms[0][1] = "KKKK";
$terms[0][2] = "A2A2";
$terms[1][0] = "FFFF";
$terms[1][1] = "TTT";
$terms[1][2] = "FFF1";
$replace_pairs[AAAA] = "KKKK";
$replace_pairs[FFFF] = "TTT";
$replace_pairs[KKKK] = "A2A2";
$output = strtr($input, $replace_pairs);
$output == KKKK BBBB CCCC DDD E TTTF GGG KKKK HHH III JJJ A2A2
我还有这样一个数组:
$input = AAAA BBBB CCCC DDD E FFFF GGG AAAA HHHH IIII JJJ KKKK
$terms[0][0] = "AAAA";
$terms[0][1] = "KKKK";
$terms[0][2] = "A2A2";
$terms[1][0] = "FFFF";
$terms[1][1] = "TTT";
$terms[1][2] = "FFF1";
$replace_pairs[AAAA] = "KKKK";
$replace_pairs[FFFF] = "TTT";
$replace_pairs[KKKK] = "A2A2";
$output = strtr($input, $replace_pairs);
$output == KKKK BBBB CCCC DDD E TTTF GGG KKKK HHH III JJJ A2A2
这些价值观既不真实也不重要。此数组由同义词组成。这意味着所有$terms[0]
键都具有相同的含义。我在这里的全部观点是将$string
中的匹配项随机替换为同一$term
键中的同义词,例如:
$output == KKKK BBBB CCCC DDD E FF1F GGG A2A2 HHH III JJJ AAAA
或
或
我该怎么做
我所能做的就是循环使用$terms[][]并为每个匹配构建一个replace_pairs
数组,使用来自相同前一个键的随机值,然后使用strtr()
,如下所示:
$input = AAAA BBBB CCCC DDD E FFFF GGG AAAA HHHH IIII JJJ KKKK
$terms[0][0] = "AAAA";
$terms[0][1] = "KKKK";
$terms[0][2] = "A2A2";
$terms[1][0] = "FFFF";
$terms[1][1] = "TTT";
$terms[1][2] = "FFF1";
$replace_pairs[AAAA] = "KKKK";
$replace_pairs[FFFF] = "TTT";
$replace_pairs[KKKK] = "A2A2";
$output = strtr($input, $replace_pairs);
$output == KKKK BBBB CCCC DDD E TTTF GGG KKKK HHH III JJJ A2A2
但是,这会将所有相等匹配(在本例中为AAAA到KKK)替换为相同的值,如下所示:
$input = AAAA BBBB CCCC DDD E FFFF GGG AAAA HHHH IIII JJJ KKKK
$terms[0][0] = "AAAA";
$terms[0][1] = "KKKK";
$terms[0][2] = "A2A2";
$terms[1][0] = "FFFF";
$terms[1][1] = "TTT";
$terms[1][2] = "FFF1";
$replace_pairs[AAAA] = "KKKK";
$replace_pairs[FFFF] = "TTT";
$replace_pairs[KKKK] = "A2A2";
$output = strtr($input, $replace_pairs);
$output == KKKK BBBB CCCC DDD E TTTF GGG KKKK HHH III JJJ A2A2
在“遍历”字符串时,是否有任何方法可以替换,以便我始终可以从同义词的数组中获取一个新的随机元素?请记住,同义词也有不同的长度。试试这个:
$input = "AAAA BBBB CCCC DDD E FFFF GGG AAAA HHHH IIII JJJ KKKK";
$terms[0][0] = "AAAA";
$terms[0][1] = "KKKK";
$terms[0][2] = "A2A2";
$terms[1][0] = "FFFF";
$terms[1][1] = "TTT";
$terms[1][2] = "FFF1";
$inputarr = explode(" ", $input);
$outputarr = array();
foreach($inputarr as $num => $element){
$outputarr[$num] = $element;
foreach($terms as $keys){
if (in_array($element, $keys)){
$outputarr[$num] = $keys[rand(0,(count($keys) - 1))];
break 1;
}
}
}
$output = implode(" ", $outputarr);
您可以使用
数组*
和lambda函数高效地完成此操作:
<?php
// This is the same format of your $terms array.
$synonyms = array(
array(
'have','possess'
),
array(
'nice','good','wonderful','pleasurable',
),
array(
'day','tide','period',
)
);
$input = "have a nice day.\n";
function synonymize($input, $synonyms) {
// Replace each word (word-boundary word-characters word-boundary)
return preg_replace_callback('#\\b(\\w+)\\b#', function($matches)
use ($synonyms) {
$word = $matches[1];
// Find what synonyms, if any, this word has.
$poss = array_filter($synonyms, function($candidates) use ($word) {
return in_array($word, $candidates);
});
// If none, we can't replace.
if (empty($poss)) {
return $word;
}
$among = array_pop($poss);
// Otherwise return the alternative.
$newword = $among[rand(0, count($among)-1)];
// log("replacing {$word} with {$newword}");
return $newword;
},
$input);
}
for ($i = 0; $i < 8; $i++) { print synonymize($input, $synonyms); }
?>