PHP – интерпретируемый скриптовый язык общего назначения, исторически ориентированный на веб. Для учебных задач он удобен тем, что сочетает простую работу со строками и файлами, мощные массивы, встроенные регулярные выражения и удобный CLI-режим. На ЕГЭ по информатике это помогает тренировать ключевые компетенции: алгоритмизацию, обработку текстов и таблиц, работу с файлами, фильтрацию и сортировку данных, проверку условий, подсчёты и преобразования.
Интерпретатор: php (CLI) запускает скрипты из командной строки:
php solve.php < input.txt > output.txt
Веб-режим: PHP работает как модуль/фастCGI у веб-сервера (Apache/Nginx). Для учебных задач достаточно CLI.
Единица кода: файл *.php, в котором можно включать шапку:
php
<?php
declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors', '1');
strict_types=1 помогает ловить ошибки типов уже на этапе выполнения.
Скалярные типы: int, float, string, bool.
Ссылочные/составные: array, object, callable, resource, null.
Аннотации типов:
php
function f(int $a, string $b): bool { /* ... */ }
Сравнение: используйте строгое ===/!== (не приводит типы). Избегайте «нестрогого» ==, которое может дать сюрпризы.
Строки и Юникод: по умолчанию строки – байтовые. Для кириллицы и точных операций по символам применяйте mb_*-функции (mb_strlen, mb_substr, mb_strtolower) и кодировку UTF-8.
Ветвления: if/elseif/else, switch, современный match (PHP 8).
Циклы: for, while, do...while, foreach (для массивов).
Функции: именованные и анонимные (замыкания) с use.
Массивы: универсальная структура и как список, и как словарь (ассоциативный массив).
Полезные семейства: array_map, array_filter, array_reduce, array_unique, array_count_values.
Сортировки:
По значениям: sort/rsort (перенумеруют ключи), asort/arsort (сохраняют ключи).
По пользовательскому компаратору: usort/uasort.
Файлы и потоки: file(), fopen/fgets/fputcsv, SplFileObject, fgetcsv – для табличных данных.
Регулярные выражения: preg_match, preg_match_all, preg_replace – мощный инструмент для задач на строки.

Строгие сравнения: всегда === и !==.
Явные преобразования: при необходимости – (int)$s, (float)$s, strval($x).
Юникод-корректность: для русскоязычных строк – только mb_*.
Обработка файлов построчно: не грузите «гигабайт в память» – читайте и обрабатывайте поток.
Детерминизм и проверяемость: одни и те же входные данные → тот же результат; не полагайтесь на состояние окружения.
Ошибки – в исключения: включайте error_reporting(EALL) и валидируйте вход.
Темы ЕГЭ – это алгоритмы, логика условий, строки, табличные данные, подсчёты. В PHP вы:
тренируете разбор текстов и регулярки;
обрабатываете таблицы CSV, как аналоги электронных таблиц;
оттачиваете сортировки/фильтрацию (аналог запросов);
решаете задачи на подсчёты и условия (классика вариантов).
php
КопироватьРедактировать
$line = trim(fgets(STDIN)); // строка из ввода
$parts = explode(';', $line); // разбиение по разделителю
$ok = preg_match('/^\d+$/', $s); // вся строка – число?
$cnts = array_count_values($arr); // частоты
usort($rows, fn($a,$b) => $b['score'] <=> $a['score'] ?: strcmp($a['name'],$b['name']));
Упражнение 1. Подсчёт по условию в числовом файле
Задача. В 17.txt записаны целые числа по одному в строке. Найдите количество
пар соседних чисел, в которых хотя бы одно делится на 3, и максимальную сумму среди таких пар. Выведите два числа: count maxSum.
Идея. Однопроходный анализ соседей, два инварианта: счётчик и максимум.
php
<?php
declare(strict_types=1);
$fh = fopen('17.txt', 'r');
$prev = null; $count = 0; $maxSum = PHP_INT_MIN;
while (($line = fgets($fh)) !== false) {
$x = (int)trim($line);
if ($prev !== null) {
if ($prev % 3 === 0 || $x % 3 === 0) {
$count++;
$sum = $prev + $x;
if ($sum > $maxSum) $maxSum = $sum;
}
}
$prev = $x;
}
fclose($fh);
echo $count, ' ', ($count ? $maxSum : 0), PHP_EOL;
Почему это «про ЕГЭ»: классический паттерн «соседние элементы + условие делимости + экстремум».
Упражнение 2. Частоты символов в UTF-8-строке
Задача. Считать одну строку из input.txt, привести к нижнему регистру, удалить пробелы и знаки пунктуации. Вывести топ-3 самых частых символа (буквы/цифры) в формате символ:частота, по убыванию частоты, затем по возрастанию символа.
Идея. Нормализация mb_strtolower, фильтрация preg_replace, подсчёт array_count_values.
php
<?php
declare(strict_types=1);
mb_internal_encoding('UTF-8');
$s = trim(file_get_contents('input.txt'));
$s = mb_strtolower($s);
$s = preg_replace('/[^\p{L}\p{N}]+/u', '', $s); // оставить только буквы и цифры
$freq = [];
for ($i = 0, $n = mb_strlen($s); $i < $n; $i++) {
$ch = mb_substr($s, $i, 1);
$freq[$ch] = ($freq[$ch] ?? 0) + 1;
}
uasort($freq, function($a, $b) use ($freq){
// сначала по убыванию частоты, при равенстве – по ключу (символу) по возрастанию
return $b <=> $a ?: 0;
});
$k = 0;
foreach ($freq as $ch => $c) {
echo $ch, ':', $c, PHP_EOL;
if (++$k === 3) break;
}
Почему это «про ЕГЭ»: обработка строк, подсчёты, сортировка – общая логика, регулярно встречается.
Упражнение 3. Фильтрация и сортировка «как таблица/БД»
Задача. Дан CSV students.csv со столбцами: surname;name;class;avg.
Вывести фамилии и средний балл всех из 11А с avg ≥ 4.6, отсортировать по убыванию avg, при равенстве – по фамилии по возрастанию.
php
<?php
declare(strict_types=1);
$fh = fopen('students.csv', 'r');
$rows = [];
while (($row = fgetcsv($fh, 0, ';')) !== false) {
[$sn, $nm, $cls, $avg] = [$row[0], $row[1], $row[2], (float)$row[3]];
if ($cls === '11А' && $avg >= 4.6) $rows[] = ['surname'=>$sn, 'avg'=>$avg];
}
fclose($fh);
usort($rows, fn($a,$b) => $b['avg'] <=> $a['avg'] ?: strcmp($a['surname'],$b['surname']));
foreach ($rows as $r) {
echo $r['surname'], ';', number_format($r['avg'], 2, '.', ''), PHP_EOL;
}
Почему это «про ЕГЭ»: аналог работы со сводной таблицей/SQL-запросом: фильтр → сортировка → вывод.
Упражнение 4. Нормализация дат и проверка корректности
Задача. В dates.txt даны даты формата DD.MM.YYYY, по одной в строке. Вывести только корректные даты в ISO-формате YYYY-MM-DD, отсортировав их по возрастанию.
php
<?php
declare(strict_types=1);
$fh = fopen('dates.txt', 'r');
$valid = [];
while (($line = fgets($fh)) !== false) {
$s = trim($line);
$dt = DateTime::createFromFormat('!d.m.Y', $s);
$errs = DateTime::getLastErrors();
if ($dt && $errs['warning_count'] === 0 && $errs['error_count'] === 0) {
// Дополнительно убедимся, что формат не «подправился» автокоррекцией
if ($dt->format('d.m.Y') === $s) $valid[] = $dt->format('Y-m-d');
}
}
fclose($fh);
sort($valid);
echo implode(PHP_EOL, $valid), PHP_EOL;
Почему это «про ЕГЭ»: строгое сравнение, проверка формата, сортировка – типовая логика задач на корректность данных.
Упражнение 5. Правила переписывания строки
Задача. Дана строка из букв A и B. Пока встречается подстрока AB – заменяйте её на BA. Затем, пока встречается BB – заменяйте её на B. Вывести итоговую строку и её длину. Вход – одна строка S (до 10⁵ символов).
Идея. Линейный односкан с использованием стека/двух фаз (сначала упорядочим A/B перестановками AB→BA, затем «схлопнем» BB→B). Решение за O(n).
php
<?php
declare(strict_types=1);
mb_internal_encoding('UTF-8');
$s = trim(stream_get_contents(STDIN));
// Фаза 1: переместим все 'A' влево от 'B' (эффект от многократных AB->BA)
$A = 0; $B = 0;
for ($i = 0, $n = strlen($s); $i < $n; $i++) {
if ($s[$i] === 'A') $A++; else $B++;
}
// После всех перестановок строка примет вид: AAA...A BBB...B
// Фаза 2: схлопывание BB->B означает, что блок B сжимается до одного символа (если он есть).
$result = str_repeat('A', $A) . ($B > 0 ? 'B' : '');
echo $result, PHP_EOL, strlen($result), PHP_EOL;
Почему это «про ЕГЭ»: классические «правила переписывания» сводятся к инвариантам и подсчётам вместо симуляции – важный навык оптимизации.
Начинайте с анализа входа: формат, ограничения, возможные «подводные камни» (пустые строки, BOM, пробелы).
Пишите чистые функции: отдельная функция на чтение, на обработку, на форматирование результата.
Фиксируйте инварианты: что именно вы считаете и почему это корректно при каждом шаге.
Проверяйте крайние случаи: пустой файл, один элемент, все элементы равны/не подходят под условие.
Не используйте «магических чисел»: вводите осмысленные константы.
PHP – удобный «тренажёр» для егэшных компетенций: строки, файлы, таблицы, сортировки, подсчёты, строгая работа с условиями и форматами. Освоив строгие сравнения, mb_* для Юникода, поточную обработку, сортировки и регулярки – вы уверенно решите класс задач ЕГЭ, а заодно получите практические навыки, которые напрямую применяются и в «настоящем» веб-программировании.