我有一个像
这样的词典UUU F
UUC F
CUU L
CUC L
UUA L
CUA L
UUG L
CUG L
AUU I
AUC I
AUA I
GUU V
GUC V
GUG V
GUA V
所以给定一个字符串我想用每个3个字符替换它们各自的字符
我在考虑使用关联数组:
$d = array();
$d['UUU']='F';
$d['UUC']='F';
$d['UUA']='L';
$d['CUU']='L';
$d['GUC']='V';
$d['GUG']='V';
$d['GUA']='V';
$d['UUG']='L';
$d['CUG']='L';
$s = "UUAGUAUUG";
$temp="";
for($i=0; $i<strlen($s)+1; $i++){
$temp .= $s[$i];
if($i%3==0){
echo $temp;
echo array_search($temp, $d);
$temp = "";
}
}
It should output LVL but have no success
答案 0 :(得分:2)
使用str_split
:
$s = 'UUAGUAUUG';
$split = str_split($s,3);
$translated = array();
foreach ($split as $bases) {
/**
* @ supresses warnings if the array index doesn't exist
*/
$translated []= @$d[$bases];
}
echo join('',$translated);
答案 1 :(得分:1)
我认为这可行:
$temp = implode(array_map(function($a) { return $d[$a];}, str_split($s, 3)));
答案 2 :(得分:1)
基本解决方案是:
<?php
$dict = array(
'UUU' => 'F',
'UUC' => 'F',
'UUA' => 'L',
'CUU' => 'L',
'GUC' => 'V',
'GUG' => 'V',
'GUA' => 'V',
'UUG' => 'L',
'CUG' => 'L'
);
$before = "UUAGUAUUG";
$after = strtr($before, $dict);
虽然您可以编写一个更快的版本,考虑到您要替换每三个字母。
我并不是百分百肯定这甚至会起作用,因为在3-char屏障上可以重叠什么样的组合。这让你有了这个糟糕的解决方案:
$after = str_replace('-', '',
strtr(preg_replace('/[A-Z]{3}/', '\0-', $before), $dict));
说真的,不要在家里试试。 ;)
答案 3 :(得分:0)
你正在错误的时间进行测试。
将$i%3 == 0
更改为$i%3 == 2
。
这里的原因是您先添加了临时字符串。这意味着您要立即检查长度为1("U"
)的字符串,然后将其清除。然后你又去了3次,得到"UAG"
,然后是"UAU"
。这些都不在您的阵列中。
我不明白的是,每次发生这种情况时都会输出$temp
的值,所以你应该对此有所了解。
答案 4 :(得分:0)
将for循环更改为:
for($i=0; $i<strlen($s)+1; $i++){
$temp .= $s[$i];
if(($i+1)%3==0){
echo $d[$temp];
$temp = "";
}
}
你的i值从0开始。而array_values没有给出预期的答案。