我有一个字符串,它包含多个值。一个新的行被识别为“财政符号”。两者之间的值属于一起。
现在,我正在尝试,例如,如果IKK和智人存在于这条线中,返回该行中的其他值(96,NC_000001,IKK,核因子抑制剂,IKK = IKKI)。
我使用based函数来分离基于符号的字符串。但如果我现在再使用爆炸功能,符号。我又得到了一个数组。但是,如果我现在要寻找智人& 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
发布于 2018-06-08 15:58:51
由于所涉及的空格,我认为您无法比较值。请试试这个:
<?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);
现在,我们可以相应地比较值。
发布于 2018-06-08 15:27:49
这一部分:
$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;
}发布于 2018-06-08 15:34:52
我没有运行它,所以这里很可能有语法错误.但也许像这样的东西能满足你的需要?将字符串传递给(post管道爆炸)的泛型函数,其中包含后续子字符串所需的一系列术语。
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
}
}https://stackoverflow.com/questions/50763702
复制相似问题