在PHP中创建遗传学计算器,结果错误

时间:2015-05-23 11:01:55

标签: php

我正在尝试制作基因计算器。我有以下代码:

<?php
    $gene1 = 'BA';
    $geneA = array();
    $i = 0;
    while ($i < strlen($gene1)) $geneA[] = substr($gene1,$i++,2);

    $gene2 = 'MSBA';
    $geneB = array();
    $i = 0;
    while ($i < strlen($gene2)) $geneB[] = substr($gene2,$i++,2);

    $possabilities = array();
    foreach ($geneA as $A) {
       foreach ($geneB as $B) {
          if ($A === strtoupper($A)) $possabilities[] = $A.$B;
          else {
             if ($B === strtoupper($B)) $possabilities[] = $B.$A;
             else $possabilities[] = $A.$B;
          }
       }
    }
    print_r($possabilities);
?>

在某种程度上起作用,它将阵列中的基因配对,但它不能正常工作。此配对应该只返回BABAMSBA。相反,它返回:

Array ( [0] => BAMS [1] => BASB [2] => BABA [3] => BAA [4] => AMS [5] => ASB [6] => ABA [7] => AA )

这对我的项目来说并不完美。我认为更好的想法是将逗号分开像$gene1 = 'BA';$gene2 = 'MS,BA';这样的基因并运行一个循环,将每个基因组合起来,但我不确定如何正确地做到这一点。任何人都可以对这个想法有所了解吗?

1 个答案:

答案 0 :(得分:2)

我希望我能够正确地假设

  • 基因总是由两对组成(MS,但不是&#34; M&#34;和&#34; S&#34;)
  • $geneA的每个成员都应与$geneB
  • 的每个成员匹配

第1部分:解决错误

在这种情况下,您的拆分算法存在严重缺陷:它始终仅在原始字符串中进行一步($gene1$gene2

function getGeneArray($geneString) {
    // check the argument for fitting your needs!
    if ( strlen($geneString) % 2 == 1 ) {
         die('Supplied geneString is not made of pairs!'); // better not die - handle errors according to your application methodology
    }
    // add additional error-catching (there are only certain possible base-pairs, if something else is found you should reject the string

    $genes = array();
    $i = 0;
    while ( $i < strlen($geneString) )
    {
        $genes[] = substr($geneString, $i, 2);
        $i += 2; // Here is your mistake, you just $i++
    }
    return $genes;
}

使用这个小功能你a)减少代码中的重复项,b)获得确定的结果(没有错误的基因)

第2部分:自己制作代码文档

看看你的代码很明显,大写基因对必须是小写对,我尝试通过使用一个清晰​​名称的额外函数与代码进行通信。

function combinePairs($A, $B) {
    // uppercase genes build the string first, which means B must be uppercase to come first and A cant be uppercase
    if (strtoupper($A) !== $A && strotoupper($B) === $B) {
        return $B.$A;
    } 
    return $A.$B;
}       

第3部分:将它们整合在一起

$geneA = getGeneArray($gene1);
$geneB = getGeneArray($gene2);

$possibilities = array();
foreach ($geneA as $A) {
    foreach ($geneB as $B) {
        $possibilities[] = combinePairs($A, $B);
    }
}

print_r($possibilities);

最后的注释

作为程序员,您希望满足客户或输入源的需求,当然您可以用逗号分割基因。尝试使用最适合您的应用程序和客户端输入的格式。在这种情况下,您可以使用explode() (explode in the manual)

轻松获取数组