1

我有一本像

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
4

5 回答 5

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);
于 2013-06-25T03:36:47.030 回答
1

我认为这可能有效:

$temp = implode(array_map(function($a) { return $d[$a];}, str_split($s, 3)));
于 2013-06-25T03:41:59.410 回答
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);

尽管考虑到每三个字母替换一次,您可能能够编写一个更快的版本。

而且我不能 100% 确定这甚至会起作用,因为什么样的组合可以在 3 字符障碍上重叠。这给你留下了这个烂解决方案:

$after = str_replace('-', '',
  strtr(preg_replace('/[A-Z]{3}/', '\0-', $before), $dict));

说真的,不要在家里尝试这个。;)

于 2013-06-25T03:46:29.430 回答
0

你在错误的时间进行测试。

更改$i%3 == 0$i%3 == 2

这里的原因是您首先添加了临时字符串。这意味着您立即检查长度为 1 ( "U") 的字符串,然后将其清除。然后你再绕行 3 次,你得到"UAG",然后是"UAU". 这些都不在您的阵列中。

我不明白的是,$temp每次发生这种情况时您都会输出值,所以您应该了解这一点。

于 2013-06-25T03:33:39.747 回答
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 没有给出预期的答案。

于 2013-06-25T03:39:18.243 回答