Алгоритмы и структуры данных на PHP: полное руководство для разработчика

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в алгоритмы и структуры данных на PHP

PHP — один из самых популярных языков для веб-разработки, но многие разработчики недооценивают важность понимания алгоритмов и структур данных. Знание этих фундаментальных концепций позволяет писать более эффективный, быстрый и масштабируемый код. В этой статье мы разберём ключевые алгоритмы и структуры данных на PHP с практическими примерами, которые помогут вам оптимизировать ваши проекты.

Независимо от того, работаете ли вы с CMS, фреймворками или создаёте API, алгоритмы и структуры данных на PHP — это инструменты, которые напрямую влияют на производительность приложения. Давайте начнём с основ.

Базовые структуры данных в PHP

Массивы: универсальный инструмент

В PHP массивы — это самая гибкая структура данных. Они могут работать как списки, стеки, очереди и даже хеш-таблицы. Рассмотрим стандартные операции:

<?php
// Создание массива
$numbers = [5, 3, 8, 1, 9];

// Добавление элемента в конец
$numbers[] = 7;

// Удаление последнего элемента (как стек)
$last = array_pop($numbers); // 7

// Удаление первого элемента (как очередь)
$first = array_shift($numbers); // 5

// Поиск элемента
$index = array_search(8, $numbers); // 1

// Сортировка
sort($numbers);
print_r($numbers); // [1, 3, 8, 9]
?>

Важно помнить: встроенные функции PHP для массивов оптимизированы на уровне C, поэтому для базовых операций используйте их, а не пишите собственные реализации.

Стек (Stack) на PHP

Стек работает по принципу LIFO (Last In, First Out). Реализация на PHP с использованием SplStack:

<?php
$stack = new SplStack();
$stack->push('первый');
$stack->push('второй');
$stack->push('третий');

echo $stack->pop(); // 'третий'
echo $stack->pop(); // 'второй'
?>

Стеки полезны для проверки скобок в коде, реализации функции "отмена" (undo) или обхода графов в глубину (DFS).

Очередь (Queue) на PHP

Очередь работает по принципу FIFO (First In, First Out). Используйте SplQueue:

<?php
$queue = new SplQueue();
$queue->enqueue('задача 1');
$queue->enqueue('задача 2');
$queue->enqueue('задача 3');

echo $queue->dequeue(); // 'задача 1'
echo $queue->dequeue(); // 'задача 2'
?>

Очереди незаменимы при обработке задач в фоне, работе с очередями сообщений (RabbitMQ, Redis) и реализации BFS (обход в ширину).

Алгоритмы сортировки на PHP

Быстрая сортировка (Quick Sort)

Один из самых эффективных алгоритмов. Реализация на PHP:

<?php
function quickSort(array $arr): array {
    if (count($arr) <= 1) {
        return $arr;
    }
    
    $pivot = $arr[0];
    $left = $right = [];
    
    for ($i = 1; $i < count($arr); $i++) {
        if ($arr[$i] < $pivot) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    
    return array_merge(
        quickSort($left),
        [$pivot],
        quickSort($right)
    );
}

$data = [3, 7, 1, 9, 2, 5];
print_r(quickSort($data)); // [1, 2, 3, 5, 7, 9]
?>

Сложность: O(n log n) в среднем, O(n²) в худшем случае. Для больших массивов используйте встроенную sort() — она быстрее.

Сортировка пузырьком (Bubble Sort)

Простой, но медленный алгоритм. Полезен для учебных целей и маленьких массивов:

<?php
function bubbleSort(array $arr): array {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = 0; $j < $n - $i - 1; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                [$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]];
            }
        }
    }
    return $arr;
}
?>

Сложность: O(n²). Не используйте для продакшена — только для обучения.

Поиск в данных на PHP

Линейный поиск

Самый простой метод — проходим по массиву последовательно:

<?php
function linearSearch(array $arr, $target): ?int {
    foreach ($arr as $index => $value) {
        if ($value === $target) {
            return $index;
        }
    }
    return null; // не найдено
}

$data = [10, 20, 30, 40, 50];
echo linearSearch($data, 30); // 2
?>

Сложность: O(n). Подходит для неотсортированных данных.

Бинарный поиск (Binary Search)

Работает только на отсортированных массивах, но очень быстрый:

<?php
function binarySearch(array $arr, $target): ?int {
    $left = 0;
    $right = count($arr) - 1;
    
    while ($left <= $right) {
        $mid = intdiv($left + $right, 2);
        
        if ($arr[$mid] === $target) {
            return $mid;
        }
        
        if ($arr[$mid] < $target) {
            $left = $mid + 1;
        } else {
            $right = $mid - 1;
        }
    }
    
    return null;
}

$sortedData = [1, 3, 5, 7, 9, 11, 13];
echo binarySearch($sortedData, 7); // 3
?>

Сложность: O(log n). Для поиска в больших отсортированных данных — лучший выбор.

Продвинутые структуры данных

Хеш-таблицы (Hash Tables)

В PHP ассоциативные массивы — это и есть хеш-таблицы. Они обеспечивают

Блоги

Рекомендаций по книгам