Для обработки массива поэлементно, если не находите подходящей встроенной функции, всегда можно воспользоваться array_map, и написать свою реализацию обработчика.
0. Учтите что у вас в вопросе написаны не массивы, а строки. массивы будут выглять так:
<?php
$prog = array(
'program analiz', 'begin', 'int i, n ; {Описание переменных}', 'float sum ; {Описание переменных}', 'readln n ; {Указание количества итераций}',
'sum:= 0.31e-1 ;', 'i:=1 ; ', 'while (i<=n)', 'begin', 'sum:=sum+(1/i);', 'i:=i+1;', 'end', 'writeln sum; {Вывод результата}', 'end.'
);
$oper = array('program','var','begin','end','ass','if','then','else','for','to','do','while','read','write','true','false');
1.
<?php
$uncomment = array_map(function($el){
return preg_replace('/(\{.*\})/', '', $el);
}, $prog);
2. Также можно фильтровать массив с помощью собственной функции.
<?php
$operators = array_unique(array_filter($oper, function($o) use ($prog) {
foreach ($prog as $line) {
if (stripos($line, $o) !== false) {
return true;
}
}
return false;
}));
3. Тут как и в п 1. регулярка и array_map
<?php
$ost = [];
array_map(function($el) use($operators, &$ost) {
if(preg_match_all('/(\w+)/', $el, $match)) {
foreach($match as $m) {
foreach($m as $word) {
var_dump($word);
if(!in_array(strtolower($word), $operators)) {
$ost[] = $word;
}
}
}
}
}, $prog);
4. ... по аналогии с 3, регулярку только другую подобрать (и с оперторами сравнивать не надо), вот удобный сервис для этого:
https://www.regex101.com/