Мультициклы на языке PHP - PullRequest
       2

Мультициклы на языке PHP

0 голосов
/ 12 октября 2019

У меня есть три цикла значений, которые смущают меня, как показать правильный вывод.

Сначала у меня есть предложение, например, это:

Еще в 1951 году астроном Джерард П. Койпер обдумывал короны, особенно те, которые вращаются вокруг Солнца менее чем за 200 лет. Эти кометы включают комету Галлея - последний раз ее видели с Земли в 1985/86 году - и Шумейкер-Леви, которая врезалась в Юпитер в 1994 году. Он выяснил, что такие кометы должны приходить с пояса, расположенного достаточно близко к планетам солнечной системы. Он заметил, что эти комментарии также имеют тенденцию приходить в урон из космоса довольно близко к плоскости планет, а не из какого-то старого направления. Койпер предсказал, что должен быть сплющенный пояс или резвый комет и астероидов, начиная от орбиты Нептуна 30 AU и достигая примерно 1000 AU или астрономических единиц. Но находить комету мимо Нептуна - все равно что пытаться увидеть 100-ваттную лампочку на расстоянии, в 20 раз превышающем расстояние от Луны. Ну, в 1992 году наши телевизионные технологии наконец-то стали достаточно хорошими.

Теперь я пометил некоторые ключевые слова в своей таблице базы данных следующим образом:

crowns,that,comments,frisk,finding

И у меня будетнекоторые ответы со стороны пользователя:

was,that,comments,see,finding

Теперь мне нужно показать, пометил ли пользователь правильные значения внутри текста, поэтому сначала я попытался использовать цикл foreach и функцию массива, но проблема в том,с дублированными ключевыми словами, такими как , .

Как я могу решить проблему с отображением ответов пользователя и проверить правильность его / ее ответа по сравнению с отмеченными ключевыми словами.

$text_array =  preg_split("/(\w\S+\w)|(\w+)|(\s*\.{3}\s*)|(\s*[^\w\s]\s*)|\s+/", $object->text,-1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE) ;
$answvals=[]; $answvals = explode(',',  $object->answer->answer);
$marked_keys = explode(',', $object->marked_keys);


        <p class="card-text">

            @foreach($text_array as $val)

            <span class="
             @if( $object->answer != null )
                      @if(in_array($val,$answvals))
                           @if(in_array($val,$marked_keys))
                    bg-success
                         @else
                       bg-danger
                         @endif
                  @endif

            @endif
            ">
            {{str_replace(' ', '', $val)}} </span>
        @endforeach
        </p>

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Ну, ключ к моему вопросу - обратное мышление. Проблема заключалась в дублировании ключевых слов, и при использовании функции in_array в PHP она хотела проверить все ключевые слова внутри массива. Тогда я подумал, что если я удалю найденные ключевые слова из массива, чтобы он больше не проверял.

Я думаю, что правильное решение - добавить нижеприведенный код в цикл foreach после проверки, равняется ли val ответу:

            $index = array_search($val,$answvals);
              if($index !== FALSE){
                  unset($answvals[$index]);
              }
0 голосов
/ 12 октября 2019

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

$sentence = "Back in 1951 , the astronomer , Gerard P . Kuiper , was pondering the crowns , especially those that loop around the Sun in less than 200 years . These comets include Halley's Comet - last seen from earth in 1985/86 - and Shoemaker-Levy which crashed into Jupiter in 1994 . He worked out that comets like these would have to come from a belt fairly close to the planets of the solar system . He noticed that these comments also tend to come hurting in from outer space quite close to the plane of the planets , rather than from just any old direction . Kuiper predicted that there should be a flattened belt or frisk of comets and asteroids , beginning just outside the orbit of Neptune 30 AU and reaching out to about 1,000 AU or astronomical units . But finding a comet past Neptune , is like trying to see a 100-watt light bulb at 20 times the distance of the Moon . Well , back in 1992 , our television technology finally got good enough .";

$marked = explode(',', 'crowns,that,comments,frisk,finding');

$answers = explode(',', 'was,that,comments,see,finding');

$words =  preg_split("/(\w\S+\w)|(\w+)|(\s*\.{3}\s*)|(\s*[^\w\s]\s*)|\s+/", $sentence,-1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE) ;

function find_duplicate_word_keys($words, $answers, $marked){
    $search_words = $answers;
    $duplicate_word_keys = [];
    foreach($search_words as $search_word){

        if(in_array($search_word, $marked)){
            foreach($words as $key=>$word){
                if($search_word == $word){
                    $duplicate_word_keys[$search_word][] = $key;
                }
            }
        }

    }
    return $duplicate_word_keys;
}

$duplicate_word_keys = find_duplicate_word_keys($words, $answers, $marked);

print_r($duplicate_word_keys);

вот рабочая ссылка , надеюсь, это поможет.

Редактировать: Новый код

Пожалуйста, попробуйте.

$sentence = "Back in 1951 , the astronomer , Gerard P . Kuiper , was pondering the crowns , especially those that loop around the Sun in less than 200 years . These comets include Halley's Comet - last seen from earth in 1985/86 - and Shoemaker-Levy which crashed into Jupiter in 1994 . He worked out that comets like these would have to come from a belt fairly close to the planets of the solar system . He noticed that these comments also tend to come hurting in from outer space quite close to the plane of the planets , rather than from just any old direction . Kuiper predicted that there should be a flattened belt or frisk of comets and asteroids , beginning just outside the orbit of Neptune 30 AU and reaching out to about 1,000 AU or astronomical units . But finding a comet past Neptune , is like trying to see a 100-watt light bulb at 20 times the distance of the Moon . Well , back in 1992 , our television technology finally got good enough .";

$marked = explode(',', 'crowns,that,comments,frisk,finding');

$answers = explode(',', 'was,that,comments,see,finding');

$words =  preg_split("/(\w\S+\w)|(\w+)|(\s*\.{3}\s*)|(\s*[^\w\s]\s*)|\s+/", $sentence,-1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE) ;

function find_duplicate_word_keys($words, $answers, $marked){
    $search_words = $answers;
    $duplicate_word_keys = [];
    foreach($search_words as $search_word){

        if(in_array($search_word, $marked)){
            foreach($words as $key=>$word){
                if($search_word == $word){
                    $duplicate_word_keys[$search_word][] = $key;
                }
            }
        }

    }
    return $duplicate_word_keys;
}

$duplicate_word_keys = find_duplicate_word_keys($words, $answers, $marked);

// print_r($duplicate_word_keys);

$answer_keys = array_keys($duplicate_word_keys);

echo '<p>';

foreach($words as $key=>$w){

    if(in_array($w, $answer_keys)){
        if(in_array($key, $duplicate_word_keys[$w])){

            echo "<span style='color:green;'>$w</span> ";
        }
    }else{

        if(in_array($w, $answers) && !in_array($w, $marked)){

            echo "<span style='color:red;'>$w</span> ";
        }else{
            echo "$w ";
        }
    }

}

echo '</p>';
...