Перейти к основному содержимому

Как перевернуть строку в PHP

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

1. Уровень Junior: Встроенная функция​

Самый простой и эффективный способ для обычных ASCII-строк — использование встроенной функции strrev().

function reverseString(string $str): string
{
return strrev($str);
}

echo reverseString("hello"); // "olleh"

2. Уровень Middle: Ручной цикл​

Ручная реализация демонстрирует понимание того, что строка в PHP по умолчанию может рассматриваться как массив байтов. Однако этот метод не безопасен для многобайтовых строк (он испортит кириллицу или эмодзи).

function reverseStringLoop(string $str): string
{
$reversed = '';
$length = strlen($str);
for ($i = $length - 1; $i >= 0; $i--) {
$reversed .= $str[$i];
}
return $reversed;
}

3. Уровень Senior: Поддержка многобайтовых строк (UTF-8)​

Современные приложения почти всегда используют UTF-8. Встроенная strrev() и ручной цикл по байтам просто "разрежут" многобайтовые символы пополам, что приведет к появлению нечитаемых данных. Senior-разработчик должен знать об этой проблеме и предлагать решения с использованием многобайтовых функций, таких как mb_str_split().

С использованием mb_str_split()​

Этот метод является эффективным и гибким способом корректной обработки символов UTF-8.

/**
* Переворачивает многобайтовую строку.
*/
function mb_strrev(string $string, string $encoding = null): string
{
$chars = mb_str_split($string, 1, $encoding ?: mb_internal_encoding());
return implode('', array_reverse($chars));
}

echo mb_strrev("Привет"); // "тевирП"
echo mb_strrev("👋🌍"); // "🌍👋"

Рекурсивный подход (Альтернатива)​

Хотя это не самое эффективное решение для длинных строк, оно демонстрирует алгоритмическое мышление.

function reverseRecursive(string $str): string
{
if (mb_strlen($str) <= 1) {
return $str;
}
return reverseRecursive(mb_substr($str, 1)) . mb_substr($str, 0, 1);
}