Я пытаюсь сделать генетический калькулятор. У меня есть следующий код:
<?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';
и запустить цикл, объединяющий каждый ген таким образом, но я не уверен, как это сделать правильно. Может ли кто-нибудь пролить свет на эту идею?
Надеюсь, я прав, полагая, что
$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. Создание самого документа кода
Глядя на ваш код, становится ясно, что пары uppercase-gene должны появляться для пар нижнего регистра, я пытаюсь сообщить об этом с помощью кода с помощью дополнительной функции с ясным именем.
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()
(взорваться в руководстве)