Выбор нескольких подстрок из строки - PullRequest
0 голосов
/ 05 июня 2019

Я новичок здесь, и у меня есть массив php некоторых строк, таких как {"VAL1", "VAL2", "VAL3", "VAL4"}, и у меня есть строка большего размера (обычно текстовый файл). Текстовый файл содержит элементы массивов в разных позициях, и некоторые или все могут повторять более одного. За каждым из элементов массива, содержащихся в текстовом файле, сразу же следует время появления, например, "VAL1 0900UTC и другая текстовая информация" . Теперь проблема в том, что я хочу найдите вхождение (я) всех элементов массива в текстовом файле и значение времени после элемента. Обратите внимание, что некоторые элементы могут встречаться более одного раза в разных позициях с разным значением времени в текстовом файле. Я уже могу загрузить текстовый файл и получить все элементы.

    $mytextfile = preg_replace('/\s+/', ' ', strtoupper(file_get_contents($textpath."/". $textfile)));

    $substr = array("REALTK","BGPTK", "SUDTK", "BECTK");  
    $bigstring = "REALTK 1000UTC 16/14 1011 BGPTK 1030UTC 10/12 992 REALTK 1145UTC 00/14 2222 SUDTK 1412UTC 11/06 1011 REALTK 1600UTC 16/14 1015 ...";

    //I created variables to hold all element occuring to false  
    $is_val1 = false; $is_val2 = false;$is_val3 = false; $is_val4 = false;

    //I created variables to count how many of each substring exist in the string  
       $numofval1=$numofval2=$numofval3=$numofval4=0;  

         if(strpos($bigstring, $substr[0]) !== false) {  
            $is_val1 = true;  
         //if exist, count how many times  
        $numofval1 =  substr_count(strtoupper($bigstring),$substr[0]);
         } e.t.c  

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

$mytextfile = preg_replace('/\s+/', ' ', strtoupper(file_get_contents($textpath."/". $textfile)));  

$substr = array("REALTK","BGPTK", "SUDTK", "BECTK");  

// это пример содержимого текстового файла
$ bigstring = "REALTK 1000UTC 16/14 1011 BGPTK 1030UTC 10/12 992 REALTK 1145UTC 00/14 2222 SUDTK 1412UTC 11/06 1011 REALTK 1600UTC 16/14 1015 ...";

//I created variables to hold all element occuring to false  
$is_realtk = false; $is_bgptk = false;$is_sudtk = false; $is_bectk = false;  

//I created variables to count how many of each of the element exist in the text file string    
   $numofrealtk=$numofbgptk=$numofsudtk=$numofbectk=0;  

     if(strpos($bigstring, $substr[0]) !== false) {  
        $is_realtk = true;  
     //if exist, count how many times  
    $numofrealtk =  substr_count(strtoupper($bigstring),$substr[0]);
     } e.t.c  

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

REALTK POSITION1 1000UTC
BGPTK POSITION5 1030UTC  
REALTK POSITION8 1145UTC  
SUDTK POSITION13 1412UTC  
REALTK POSITION17 1600UTC  

Я также хочу сохранить элемент => timevalue в качестве ассоциативного массива. Спасибо в ожидании.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Вот фрагмент кода для вас, пожалуйста, смотрите встроенный документ для объяснения

$substr = array("VAL1","VAL2", "VAL3", "VAL4");
$bigstring = "OTHERS VAL1 VAL4 VAL1 OTHERS OTHERS VAL2 OTHERS";
// considering space to explode words and having numbers in it
$temp = array_unique(str_word_count($bigstring, 1,"0..9"));
// sorting generated array and keeping index of value
asort($temp);
// matching records from array
$temp = array_intersect($temp,$substr);
// showing all the data you want 
array_walk($temp,function($item,$k){
    echo $item.' POSITION '.$k."\n"; // replace \n with <br/> if web
});

Рабочая демонстрация .

0 голосов
/ 05 июня 2019

Если элементы в вашей $ bigstring всегда разделяются пробелами, вы можете взорваться:

$val_arr = array( "REALTK" => array(), "BGPTK" => array(), "SUDTK" => array(), "BECTK" => array();
$bigstring_arr = explode( " ", $bigstring);
foreach( $bigstring_arr as $key => $part ){
    if( in_array( $part, $substr ) ){
        $val_arr[$part][] = array( "position" => $key+1, "time" => $bigstring_arr[$key+1] );
    }
}

Если это не так, вы также можете взорваться непосредственно на каждом элементе Val1, Val2 .... Код становится немного сложнее. Но это также сработало бы, если бы вы создали новый массив в виде «CountOfAllCharsInBigstringBeforeOccurence» => «KeyOfValInSubstr». Из этого вы можете получить свой заказ с vals.

Edit: Я отредактировал код на основе вашего комментария. Обратите внимание, что невозможно иметь массив с одним и тем же ключом несколько раз, поэтому решение здесь будет иметь несколько измерений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...