PHP - поиск слов массива в строках в возвращаемом значении массива в обоих случаях

Проблема

У меня два массива. 1 массив содержит слова, другой массив - строки. Я написал код, который найдет слово в строке. Если одно из слов найдено в строке. Я отвечаю на слово. Но если ни одно из слов в массиве не найдено в строке, я также хотел бы вернуть одно значение. Я написал несколько кодов и всегда получаю одни и те же случаи.

Случаи:

  • Я не получил никакой ценности, когда не было совпадений
  • Я получил значение из результата до
  • У меня есть все совпадения по стоимости и нет совпадений

Вопрос

Я где-то ошибся. Как я могу сохранить для каждой строки слово, если оно найдено, а если не найдено, устанавливается значение пропущенного значения?

Код

Input
$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
    }

Хорошо, обо всем по порядку. Вход, процесс, выход. Можете ли вы дать нам пример ввода и каким должен быть ожидаемый результат?

delboy1978uk 12.06.2018 16:54

Согласитесь с delboy, в этом случае немного неясно, чего вы ожидаете, укажите несколько входных данных и какой должен быть выход каждого.

Andreas 12.06.2018 17:00

Отредактировал свой вопрос, надеюсь помогло.

Nemo 12.06.2018 17:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
998
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Просто взяв за основу свою первую версию, возникла пара проблем. Вы не сбрасывали поле, которое вы используете для сохранения совпадения, поэтому в следующий раз в нем все еще будет совпадение из предыдущего цикла.

Вы также использовали $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

https://3v4l.org/64Qmq

Другие вопросы по теме