Найти значение по ключевым перестановкам, php - PullRequest
0 голосов
/ 06 января 2019

У меня много комбинаций разных типов генов. Каждая комбинация имеет свою ценность. Я хочу найти значение по комбинации.

Примечание:

Переключаемые буквы одинаковы. Пример: 'CT' = 'TC', 'AG' = 'GA' и т. Д.

Я решаю это сейчас, преобразовывая буквы в числа и сравнивая их суммы. Смотри мой код, пожалуйста.

Это хороший подход? Должен ли я изменить свою структуру данных? ($ Карта)

<?php

function toNum($string)
{
  $map = [
    'A' => 1,
    'C' => 2,
    'G' => 3,
    'T' => 4,
  ];

  $arr = str_split($string);
  $r   = 0;

  foreach ($arr as $value) {
    if (!isset($map[$value])) {
      continue;
    }

    $r += $map[$value];
  }

  return $r;
}

function getValue($map, $input)
{
  foreach ($map as $row => $key) {
    $current_row = $row;

    $row     = explode(',', $row);
    $attempt = 0;

    foreach ($row as $key => $value) {
      if (toNum($row[$key]) === toNum($input[$key])) {
        $attempt++;
      }
    }

    if ($attempt === count($row)) {
      return $map[$current_row];
    }
  }
}

$map = [
  'CC,GG,AA,CC' => 'high',
  'TT,AG,TT,CG' => 'medium',
  'CT,AG,TT,GG' => 'low',
];

echo getValue($map, ['CC', 'GG', 'AA', 'CC']) . "\n"; // high
echo getValue($map, ['TT', 'AG', 'TT', 'CG']) . "\n"; // medium
echo getValue($map, ['TT', 'GA', 'TT', 'GC']) . "\n"; // medium
echo getValue($map, ['CT', 'AG', 'TT', 'GG']) . "\n"; // low

?>

1 Ответ

0 голосов
/ 06 января 2019

Вы можете сделать это немного проще, вычислив правильный ключ карты с учетом вашего ввода, не меняя структуру.

function sortString($string)
{
  $type_chars = str_split($string);
  sort($type_chars);
  return implode($type_chars);
}

function getValue($map, $input)
{
  $key = implode(',', array_map('sortString', $input));
  return $map[$key] ?? null;
}

Обратите внимание, что последняя строка - только PHP7. Если вы не используете его, вы можете заменить его на:

return isset($map[$key]) ? $map[$key] : null;

Затем вы заказываете ключи вашей карты, используя тот же обратный вызов:

function sortMap($map)
{
  return array_reduce(array_keys($map), function ($sorted_map, $types) use ($map) {
    $sorted_types = preg_replace_callback('/[A-Z]{2}/', function ($matches) {
      return sortString($matches[0]);
    }, $types);
    $sorted_map[$sorted_types] = $map[$types];
    return $sorted_map;
  }, []);
}

Демо: https://3v4l.org/4HhsV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...