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