dok2d
@dok2d
Сисадмин, делаю сайты разной паршивости

Как грамотно анализировать массив?

Здравствуйте!
Прошу, не ругайте сильно за столь "профанские" вопросы, я только начинаю изучать 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='program,var,begin,end,ass,if,then,else,for,to,do,while,read,write,true,false';

1. Каким образом из $prog удалить "комментарии" (фигурные скобки с содержимым)? Предполагаю, что лучше использовать регулярку, но мои варианты не действуют.
2. Из $prog выбрать совпадающие элементы массива $oper и поместить их в новый массив (допустим, $operators) без привязки к регистру и исключая повторения.
Я думаю, что тут применим array_filter, но опять ничего не вышло.
3. Как выгрузить в ещё один массив ($ost) оставшиеся слова без цифр и знаков?
4. И как выгрузить в новый массив ($cif) числа через запятую? Тоже пытался через регулярки..
Если Вы не против, то как можно подробнее, чтобы не только смог использовать, но и понять хочется.
  • Вопрос задан
  • 330 просмотров
Решения вопроса 1
jakulov
@jakulov
Для обработки массива поэлементно, если не находите подходящей встроенной функции, всегда можно воспользоваться 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/
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы