我正在尝试制作基因计算器。我有以下代码:
<?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);
?>
在某种程度上起作用,它将阵列中的基因配对,但它不能正常工作。此配对应该只返回BABA
和MSBA
。相反,它返回:
Array ( [0] => BAMS [1] => BASB [2] => BABA [3] => BAA [4] => AMS [5] => ASB [6] => ABA [7] => AA )
这对我的项目来说并不完美。我认为更好的想法是将逗号分开像$gene1 = 'BA';
和$gene2 = 'MS,BA';
这样的基因并运行一个循环,将每个基因组合起来,但我不确定如何正确地做到这一点。任何人都可以对这个想法有所了解吗?
答案 0 :(得分:2)
我希望我能够正确地假设
$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)