php - 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 是为写在同一文件中的字母制作的)谢谢。
解决方案
您可以使用完全不同的方法,例如:
$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
因此,我们使用多维数组来保留所有字母的替代文本,然后在需要时移动每个文本子数组的指针,以在每个新出现的相同字母时替换文本。
推荐阅读
- python - 将具有超过值的文本文件转换为字典
- linux - .xpm 文件未加载
- jquery - 未捕获的类型错误:无法设置未定义的属性“前景”
- python - 使用 Dataframe.iloc(bool) 后如何获取原始索引
- angular - 如何在使用 jib 时创建 docker-compose.yml 文件?
- python - Python Face-Recognition - 搜索多个图像的文件夹以进行匹配
- ios - 如何在 iOS 13 的 AVPlayer 中播放不安全的视频?
- c# - 如何从签名邮件中获取 .msg 文件?
- powershell - 以有效的方式将哈希表转换回字符串数据
- react-native - 如何在 React-Native 中的抽屉导航中的屏幕之间传输数据