首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据字符串php中的特定单词获取字符串的特定部分。

根据字符串php中的特定单词获取字符串的特定部分。
EN

Stack Overflow用户
提问于 2018-06-08 15:16:08
回答 5查看 52关注 0票数 0

我有一个字符串,它包含多个值。一个新的行被识别为“财政符号”。两者之间的值属于一起。

现在,我正在尝试,例如,如果IKK和智人存在于这条线中,返回该行中的其他值(96,NC_000001,IKK,核因子抑制剂,IKK = IKKI)。

我使用based函数来分离基于符号的字符串。但如果我现在再使用爆炸功能,符号。我又得到了一个数组。但是,如果我现在要寻找智人& IKK,并且想从这一行返回其他值,我就被卡住了。

我有以下字符串:

代码语言:javascript
复制
    $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';

我的代码:

代码语言:javascript
复制
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"; 
    }
}

我也许应该以这样的方式结束。但我找不到去那里的方法。有可能得到这样的结构吗?

代码语言:javascript
复制
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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-08 15:58:51

由于所涉及的空格,我认为您无法比较值。请试试这个:

代码语言:javascript
复制
<?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函数中,我们对数组的每个值应用了trim函数,方法是:$d = array_map('trim',$res);

现在,我们可以相应地比较值。

票数 1
EN

Stack Overflow用户

发布于 2018-06-08 15:27:49

这一部分:

代码语言:javascript
复制
$res = explode(",",$value);
foreach ($res as $v){
    echo "tester: >> $v"."<br \>\n"; 
}

重写为

代码语言:javascript
复制
$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;
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-08 15:34:52

我没有运行它,所以这里很可能有语法错误.但也许像这样的东西能满足你的需要?将字符串传递给(post管道爆炸)的泛型函数,其中包含后续子字符串所需的一系列术语。

代码语言:javascript
复制
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 [];
}

然后用类似的

代码语言:javascript
复制
foreach ($test as $key => $value){
    $res = filterList($value, ["Homo sapiens","IKK"]);
    if(! empty($res)){
      //do something with res
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50763702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档