У меня два массива. 1 массив содержит слова, другой массив - строки. Я написал код, который найдет слово в строке. Если одно из слов найдено в строке. Я отвечаю на слово. Но если ни одно из слов в массиве не найдено в строке, я также хотел бы вернуть одно значение. Я написал несколько кодов и всегда получаю одни и те же случаи.
Я где-то ошибся. Как я могу сохранить для каждой строки слово, если оно найдено, а если не найдено, устанавливается значение пропущенного значения?
$csv_specie = array("Mouse","Human");
$CDNA = 'Human interleukin 2 (IL2)a;Ampicillin resistance gene (amp)a;Mouse amp gene';
# Split string by ; symbol into an array
$CDNA_new = preg_split("/\b;\b/", $CDNA);
Output (I would like to end with something like this
foreach ($CDNA_new as $string){
$specie = $result ## Human
echo $specie."-"$sring. "<br \>\n";
}
Результат в веб-браузере:
Human-Human interleukin 2 (IL2)a
NA-Ampicillin resistance gene (amp)a
Mouse-Mouse amp gene
# Go through the string
foreach($CDNA_new as $t){
# Go through the specie array
foreach ($csv_specie as $c){
# Find specie in string
if (strpos($t, $c) !== FALSE ){
$match = $c;
$specie = $c;
}
}
# If no match found set values to missing values
if (isset($specie) !== TRUE){
$match = "NA";
$specie = "NA";
}
echo "----------------------". "<br \>\n";
echo '+'.$specie. "<br \>\n";
echo '+'.$match. "<br \>\n";
echo '+'.$t. "<br \>\n";
# Work further with the values to retrieve gene ID using eSearch
}
# use function to find match
function existor_not($str, $character) {
if (strpos($str, $character) !== false) {
return $character;
}
return $character = "0";
}
foreach ( $CDNA_new as $string ){
foreach ( $csv_specie as $keyword ){
$test = existor_not($string,$keyword);
}
echo "-".$test."|" . $string. "<br \>\n";
# Work further with the values to retrieve gene ID using eSearch
}
foreach ( $CDNA_new as $string ){
foreach ( $csv_specie as $keyword ){
$result = stripos($string, $keyword);
if ($result === false) {
$specie = "NA";
}
else {
$specie = $keyword;
}
}
if ($specie !== "NA"){
echo "match found";
}else{
$match = "NA";
$specie = "NA";
}
echo $specie. "<br \>\n";
# Work further with the values to retrieve gene ID using eSearch
}
Согласитесь с delboy, в этом случае немного неясно, чего вы ожидаете, укажите несколько входных данных и какой должен быть выход каждого.
Отредактировал свой вопрос, надеюсь помогло.






Просто взяв за основу свою первую версию, возникла пара проблем. Вы не сбрасывали поле, которое вы используете для сохранения совпадения, поэтому в следующий раз в нем все еще будет совпадение из предыдущего цикла.
Вы также использовали $qspecie и настраивали $specie.
foreach($CDNA_new as $t){
$match = null; // Reset value for match
# Go through the specie array
foreach ($csv_specie as $c){
# Find specie in string
if (strpos($t, $c) !== FALSE ){
$match = $c;
break; // Don't carry on if you found a match
}
}
# If no match found set values to missing values
if ($match == null){
$match = "NA";
}
echo "----------------------". "<br \>\n";
echo '+'.$match. "<br \>\n";
echo '+'.$t. "<br \>\n";
# Work further with the values to retrieve gene ID using eSearch
}
Или вы можете полагаться на установку фиктивного значения, а затем оно будет перезаписано только в случае обнаружения подлинного совпадения ...
foreach($CDNA_new as $t){
$match = "NA";
# Go through the specie array
foreach ($csv_specie as $c){
# Find specie in string
if (strpos($t, $c) !== FALSE ){
$match = $c;
break;
}
}
echo "----------------------". "<br \>\n";
echo '+'.$match. "<br \>\n";
echo '+'.$t. "<br \>\n";
# Work further with the values to retrieve gene ID using eSearch
}
Вы можете использовать preg_grep для сопоставления без учета регистра внутри цикла specie's. Затем я использую array_diff для удаления элементов из $ cdna, чтобы убедиться, что я больше не совпадаю и не трачу время. В $ cdna после цикла остаются элементы, которые не совпадают, я добавляю их к элементу «N / A».
$csv_specie = array("Mouse","Human");
$CDNA = 'Human interleukin 2 (IL2)a;Ampicillin resistance gene (amp)a;Mouse amp gene;Some other stuff unknown to man kind';
$csv_specie = array("Mouse","Human");
$CDNA = 'Human interleukin 2 (IL2)a;Ampicillin resistance gene (amp)a;Mouse amp gene;Some other stuff unknown to man kind;some other human stuff';
$cdna = explode(";", $CDNA);
Foreach($csv_specie as $specie){
$matches[$specie] = preg_grep("/\b" . $specie . "\b/i", $cdna);
Echo $specie . " - " . implode("\n" . $specie . " - " , $matches[$specie]) . "\n";
// Remove matched items from $cdna
// This makes $cdna smaller for each
// iteration and make it faster.
$cdna = array_diff($cdna, $matches[$specie]);
}
// What is left in $cdna is not matched
$matches["N/A"] = $cdna;
Echo "\nN/A - " . implode("\nN/A - ", $matches["N/A"]);
Выход:
Mouse - Mouse amp gene
Human - Human interleukin 2 (IL2)a
Human - some other human stuff
N/A - Ampicillin resistance gene (amp)a
N/A - Some other stuff unknown to man kind
Хорошо, обо всем по порядку. Вход, процесс, выход. Можете ли вы дать нам пример ввода и каким должен быть ожидаемый результат?