首页 > 解决方案 > PHP如果在单个单词字符串中检测到字符重复,则替换相关文本输出以供第二次出现

问题描述

我为在表单上输入的一个单词字符串中的每个字母分配一个文本输出。例如,如果 $name = ben,我会按照它们出现的顺序输出 'text for b' 'text for e' 'text for n'。如果再次出现一个字母,我想分配替代文本,所以如果 $name = benjamin 我为第三个字母输出'text for n',但为最后一个字母输出'alternative text for second n'。

到目前为止,我使用此循环输出字母的文本:

texts= [
    'a' => 'text for letter a',
    'b' => 'text for letter b', //etc
];

for ($i = 0; $i < mb_strlen($name); $i++) {
    $letter = mb_substr($name, $i, 1); // Get current letter.
    $text_for_letter = $texts[$letter] ?? null; // Get the text for this //letter from the array of texts.

    if ($text_for_letter) {
    echo 'Text for letter ' . $letter . ' is: ' . $text_for_letter, '<br>';
    } 
}  

我分析字母是否与以下内容重复:

$name = 'benjamin'; //example of what might have been entered on form, will vary

function mb_count_chars($name, 'UTF-8') {
    $occurrence = array();
    for ($i = 0; $i < mb_strlen($name); $i++) {
        $letter = mb_substr($name, $i, 1, 'UTF-8');
        if(!array_key_exists($letter, $occurrence))
            $occurrence[$letter] = 0;
        $occurrence[$letter]++;
    }
    return $occurrence;
}
print_r( mb_count_chars($name) ); 

结果是

Array ( [b] => 1 [e] => 1 [n] => 2 [j] => 1 [a] => 1 [m] => 1 [i] => 1 )

并找到字母在名称中的位置:

<?php print_r(str_split($name)); ?>

Array ( [0] => b [1] => e [2] => n [3] => j [4] => a [5] => m [6] => i [7] => n ) 

当在 $name 中检测到重复/三重字母时,您建议使用什么代码以正确的相应顺序输出替代文本。(假设 $alt_texts2 /3 是为写在同一文件中的字母制作的)谢谢。

标签: phpstringloopsduplicates

解决方案


您可以使用完全不同的方法,例如:

$name = 'benjamin'; 

$texts= [
    'a' =>[ 'text for letter a','text for letter alternate','text for letter alternate2','text for letter alternate3 etc'],
    'b' => ['text for letter b'], //etc
    'n' =>[ 'text for letter n','text for letter n alternate ','text for letter n alternate2','text for letter n alternate3 etc'],
];


for ($i=0,$strlen=mb_strlen($name);$i <$strlen; $i++) {
    $letter = mb_substr($name, $i, 1); // Get current letter.
    if(isset($texts[$letter])){
        $current=current($texts[$letter]);
        next($texts[$letter]);
        $text_for_letter =$current; // Get the text for this //letter from the array of texts.
    }else{
        $text_for_letter=null;
    }
    if ($text_for_letter) {
        echo 'Text for letter ' . $letter . ' is: ' . $text_for_letter, '<br>';
    } 
}

输出是:

Text for letter b is: text for letter b
Text for letter n is: text for letter n
Text for letter a is: text for letter a
Text for letter n is: text for letter n alternate 

因此,我们使用多维数组来保留所有字母的替代文本,然后在需要时移动每个文本子数组的指针,以在每个新出现的相同字母时替换文本。


推荐阅读