I get an array with file('file.txt') , a file of this type:

 "понедельник, 21 августа ... ... вторник ... ... среда, 23 августа ..." 

I need to break an array by days of the week (an array of regular expressions):

 $days = array( '/^Понедельник+/', '/^Вторник+/', '/^Среда+/', '/^Четверг+/', '/^Пятница+/', '/^Суббота+/', '/^Воскресенье+/', ); 

If it is 7 days, file () will turn into 7 arrays. I can find the keys of the days of the week using preg_grep, which are found in file () ... If you had to make 2 arrays out of one, you can use array_slice. But what if they can be from 7 pieces?

  • It is not very clear what is and what to get. Add a couple of examples of input and output (expected) values. - Lexx918
  • Dear users. If you have received an answer to your question, please do not forget to mark it as an answer! It is important! - Stanislav Hmelevsky

2 answers 2

As an option, you can bring to perfection yourself:

 <?php $array[0] = 'Понедельник день'; $array[1] = '12'; $array[2] = '12'; $array[3] = 'Вторник день'; $array[4] = '45'; $array[5] = '45'; $array[6] = 'Среда день'; $array[7] = '789'; $array[8] = '789'; $array[9] = '789'; $now = -1; $response = array(); foreach ($array as $key => $value) { if (preg_match('/^Понедельник+|^Вторник+|^Среда+/', $value)) { $now++; }else{ if ($now > -1) $response[$now][] = $value; } } print_r($response); 

Further you will understand, the answer is:

 Array ( [0] => Array ( [0] => 12 [1] => 12 ) [1] => Array ( [0] => 45 [1] => 45 ) [2] => Array ( [0] => 789 [1] => 789 [2] => 789 ) ) 

    Greetings Perhaps the solution is not the most elegant, if anything, modify it yourself! ;)

    Text in file:

     Понедельник, 21 августа Сервер работает Вторник, 22 августа Сервер упал Среда, 23 августа Сервер работает Сервер работает Среда, 24 августа Сервер упал Вторник, 25 августа 

     $text_arr = file("t.txt"); $days = [ '/^Понедельник+/', '/^Вторник+/', '/^Среда+/', '/^Четверг+/', '/^Пятница+/', '/^Суббота+/', '/^Воскресенье+/', ]; $keys = []; $result = []; /** * Перебираем массив паттернов и проверяем вхождения по тексту * отсекая пустые элементы, и записываем в $keys порядковый номер строки с датой * Все последующие id между ними, наши будущие массивы с текстом. * На выходе получаем массив вида: * [0]=> int(0) [1]=> int(2) [2]=> int(9) [3]=> int(4) [4]=> int(7) ... */ foreach ($days as $day): $search = preg_grep($day, $text_arr); if (!empty($search)): foreach ($search as $id => $chunk): array_push($keys, $id); endforeach; else: continue; endif; endforeach; /** Сортируем массив по значениям, по порядку, т.к. парсить текст мы будем сверху вниз */ sort($keys); /** * Увеличиваем наши id на 1, для того чтобы не включать даты в результат * Обрезаем массив по отступу, где стартовым отступом будет найденный выше id, * а длинной отступа будет разница, между id следующего элемента и текущего. */ foreach ($keys as $id => $key): ++$key; if (++$id != count($keys)): array_push($result, array_slice($text_arr, $key, next($keys) - $key)); else: array_push($result, array_slice($text_arr, $key)); endif; endforeach; 

    Result:

     array(5) { [0]=> array(1) { [0]=> string(31) "Сервер работает" } [1]=> array(1) { [0]=> string(23) "Сервер упал" } [2]=> array(2) { [0]=> string(31) "Сервер работает " [1]=> string(31) "Сервер работает" } [3]=> array(1) { [0]=> string(23) "Сервер упал" } [4]=> array(0) { } }