Получить конкретные части строки на основе конкретных слов в строке php - PullRequest
0 голосов
/ 08 июня 2018

У меня есть строка, которая содержит несколько значений.Новая строка распознается как |условное обозначение.Значения между |принадлежат друг другу.

Теперь я пытаюсь, например, если IKK и Homo Sapiens присутствуют в строке, чтобы вернуть другие значения в этой строке (96, NC_000001, IKK, ингибитор ядерного фактора, IKK = IKKI).

Я использую функцию разнесения для разделения строк на основе |условное обозначение.Но если я снова использую функцию разнесения, теперь на основе символа.Я снова получил массив.Но если я сейчас буду искать homo sapiens & IKK и захочу вернуть другие значения из той же строки, я застряну.

У меня есть следующая строка:

    $var = 'IKK ,Homo sapiens,96, NC_000001 , IKK , inhibitor of nuclear factor, 
    IKK = IKKI |GAL4 ,Saccharomyces cerevisiae,85588,NC_00114 , GAL4 ,0, GAL81
    |TRP ,Influenza HA,0,0,0,0,0|TES,Influenza HA,5,0,TES,0,0';

Мой код:

function terms($result){
    $result = (explode("|",$result));
    $final = array_unique($result);
    return $final;
}
$test = terms($var);
foreach ($test as $key => $value){
    echo "key: $key -- value: $value"."<br \>\n"; 
    $res = explode(",",$value);
    foreach ($res as $v){
        echo "tester: >> $v"."<br \>\n"; 
    }
}

Я, вероятно, должен получить что-то подобное.Но я не нахожу способ добраться туда.Можно ли даже получить эту структуру?

if ($d[1] == "Homo sapiens" && $d[0] == "IKK"){
    $k = $d[2] # 96
    $s = $d[3] # NC_000001
 }

В качестве конечного результата я хотел бы сохранить значения 96, NC_000001, IKK, ингибитор ядерного фактора, IKK = IKKI снова и снова отдельно в отдельной переменной,$ number = 96 $ acc = NC_000001

Ответы [ 5 ]

0 голосов
/ 08 июня 2018

PHP имеет концепцию вложенных массивов.Каждый элемент массива также может быть массивом.Так что взрывайте и перебирайте линии, а затем взрывайте поля.Вы можете использовать array_map() для очистки значений полей:

$data = 
  'IKK ,Homo sapiens,96, NC_000001 , IKK , inhibitor of nuclear factor, IKK = IKKI |'.
'GAL4,Saccharomyces cerevisiae,85588,NC_00114 , GAL4 ,0, GAL81|'.
'TRP ,Influenza HA,0,0,0,0,0|TES,Influenza HA,5,0,TES,0,0';

$values = [];
foreach (explode('|', $data) as $line) {
  $values[] = array_map(
    function($field) {
      return trim($field);
    },
    explode(',', $line)
  );
}

var_dump($values);

Вывод:

array(4) {
  [0]=>
  array(7) {
    [0]=>
    string(3) "IKK"
    [1]=>
    string(12) "Homo sapiens"
    [2]=>
    string(2) "96"
    [3]=>
    string(9) "NC_000001"
    [4]=>
    string(3) "IKK"
    [5]=>
    string(27) "inhibitor of nuclear factor"
    [6]=>
    string(10) "IKK = IKKI"
  }
  [1]=> ...

Итак, теперь у вас есть список массивов, который вы можете использовать array_filter().

$filteredValues = array_filter(
  $values,
  function($fields) {
    return ($fields[0] === 'IKK' && $fields[1] === 'Homo sapiens');
  }
);

var_dump($filteredValues);

Или вы используете foreach(), чтобы найти первую строку, соответствующую вашему состоянию.

$searchedLine;
foreach ($values as $fields) {
  if ($fields[0] === 'IKK' && $fields[1] === 'Homo sapiens') {
    $searchedLine = $fields;
    break;
  }
}

var_dump($searchedLine);
0 голосов
/ 08 июня 2018

Из-за пробелов, я думаю, вы не можете сравнивать значения.Пожалуйста, попробуйте это:

<?php

$var = 'IKK ,Homo sapiens,96, NC_000001 , IKK , inhibitor of nuclear factor, 
    IKK = IKKI |GAL4 ,Saccharomyces cerevisiae,85588,NC_00114 , GAL4 ,0, GAL81
    |TRP ,Influenza HA,0,0,0,0,0|TES,Influenza HA,5,0,TES,0,0';

function terms($result){
    $result = (explode("|",$result));
    $final = array_unique($result);
    return $final;
}


function compare_terms($res){
    $d = array_map('trim',$res);
    if ($d[1] == "Homo sapiens" && $d[0] == "IKK") {
        $k = $d[2] ; 
        echo $k ."<br \>\n"; // 96
        $s = $d[3] ; 
        echo $s ."<br \>\n"; // NC_000001
    }
}


$test = terms($var);
foreach ($test as $key => $value){
    echo "key: $key -- value: $value"."<br \>\n"; 
    $res = explode(",",$value);
    compare_terms($res);
}

Здесь, в функции compare_terms, мы применили функцию обрезки к каждому значению массива, используя: $ d = array_map ('trim', $ res);

Теперь мы можем сравнивать значения соответственно

0 голосов
/ 08 июня 2018

Я не запускал его, поэтому здесь вполне могут быть синтаксические ошибки ... но, может быть, что-то подобное подойдет вашим потребностям?Универсальная функция для передачи строки в (post pipe explode) с массивом терминов, который должна иметь следующая подстрока

function filterList($str, $needed = []){
    //str is the pre-exploded comma delimited string
    //needed are the terms required for the string to pass
    //needed terms are filtered out of the returned array
    $found = true;
    if(! is_array($needed)) $needed = [$needed];
    foreach($needed as $needs_str){
        if(stripos($str, $needs_str) === false){
            $found = false;
        }
    }
    if($found){
        return array_filter(explode($str, ','), function($item) use ($needed){
            return ! in_array($item, $needed);
        });
    }
    return [];
}

, а затем использовать как

foreach ($test as $key => $value){
    $res = filterList($value, ["Homo sapiens","IKK"]);
    if(! empty($res)){
      //do something with res
    }
}
0 голосов
/ 08 июня 2018

Одна из начальных проблем заключается в том, что ваши исходные данные содержат пробелы повсюду, поэтому первая часть состоит в том, чтобы разделить данные и trim() все данные.array_walk() используется для обработки каждой строки за раз.

Тогда это случай фильтрации результата по полям, которые вы хотите.Это случай проверки, совпадает ли массив $filters с первыми полями в терминах (используя array_slice() для извлечения нужного количества полей), просто сравните массивы, а не отдельные поля, но это предполагает поляв том же порядке.

Затем с выводом он обрабатывает любые результаты, удаляя фильтр с передней панели (снова используя array_slice()).

$var = 'IKK ,Homo sapiens,96, NC_000001 , IKK , inhibitor of nuclear factor,
    IKK = IKKI |GAL4 ,Saccharomyces cerevisiae,85588,NC_00114 , GAL4 ,0, GAL81
    |TRP ,Influenza HA,0,0,0,0,0|TES,Influenza HA,5,0,TES,0,0';

$terms = explode("|", $var);
array_walk($terms, function (&$line) {
    $line = explode(",",$line);
    $line = array_map('trim', $line);
});

$filters = ["IKK", "Homo sapiens"];
$output = array_filter($terms, function ($line) use ($filters)  {
    return $filters == array_slice($line, 0,count($filters));
});
array_walk($output, function (&$line) use ($filters) {
    $line = array_slice($line, count($filters));
});
print_r($output);
0 голосов
/ 08 июня 2018

Для этой части:

$res = explode(",",$value);
foreach ($res as $v){
    echo "tester: >> $v"."<br \>\n"; 
}

переписать как

$filters = array("IKK", "Homo sapiens", .... "etc.");

$res = explode(",", $value);
$raw_filtered_res = array_filter($res, function ($v, $k) use($filters) {
    return !in_array($v, $filters);
}, ARRAY_FILTER_USE_BOTH);

if (count($res) !== count($raw_filtered_res)) {
    $filtered_res = array_values(array_diff($res, $raw_filtered_res));
    foreach ($filtered_res as $v) {
        echo "tester: >> $v"."<br \>\n"; 
    }
} else {
    break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...