Последний символ строки в PHP: 5 простых способов и частые ошибки

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

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

Начать курс

Как получить последний символ строки в PHP: полный гайд для начинающих и не только

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

На Stack Overflow этот вопрос набрал сотни тысяч просмотров, а под ним — десятки комментариев с альтернативными решениями. Оказывается, даже такая простая операция, как получение последнего символа строки в PHP, имеет свои нюансы: от работы с многобайтовыми кодировками до неочевидных багов.

В этой статье мы разберём 5 способов получить последний символ строки, развеем популярные мифы и покажем, как избежать типичных ошибок. Поехали!

1. Классический способ: substr() и strlen()

Самый распространённый метод, который вы найдёте в любом учебнике — использование комбинации substr() и strlen(). Давайте вспомним, как это работает:

<?php
$string = "Привет, мир!";
$lastChar = substr($string, -1); // Используем отрицательный индекс
echo $lastChar; // Выведет "!"
?>

Начиная с PHP 7.1, мы можем использовать отрицательные значения в substr(). Это самый лаконичный и понятный способ. Раньше приходилось писать так:

<?php
$string = "Hello World";
$lastChar = substr($string, strlen($string) - 1); // Более громоздкий вариант
echo $lastChar; // "d"
?>

Важно! Этот метод отлично работает с ASCII-символами (латиница, цифры, знаки препинания). Но если ваша строка содержит кириллицу, эмодзи или другие многобайтовые символы — читайте дальше.

2. Проблема с UTF-8: почему substr() не работает с кириллицей

Представьте: вы пишете сайт на русском языке и пытаетесь получить последний символ строки "Привет" с помощью substr(). Что вы увидите?

<?php
$string = "Привет";
$lastChar = substr($string, -1);
echo $lastChar; // Выведет "�" или вообще ничего
?>

Почему так происходит? Дело в том, что кириллические символы занимают 2 байта в кодировке UTF-8 (а некоторые эмодзи — до 4 байт). Функция substr() работает на уровне байтов, а не символов. Она «откусывает» один байт, разбивая символ пополам — отсюда и кракозябры.

Решение — использовать многобайтовые функции. В PHP для этого есть целое семейство mb_* функций.

3. Правильный способ: mb_substr() для многобайтовых строк

Если ваше приложение работает с Unicode (а сегодня это 99% случаев), используйте mb_substr():

<?php
$string = "Привет, мир!";
$lastChar = mb_substr($string, -1, 1, 'UTF-8');
echo $lastChar; // Корректно выведет "!"
?>

Обратите внимание на параметры:

  • -1 — начинаем с конца строки
  • 1 — берём один символ
  • 'UTF-8' — указываем кодировку (обязательно!)

Без указания кодировки mb_substr() будет использовать внутреннюю кодировку, которая может отличаться от кодировки вашей строки. Всегда явно задавайте кодировку!

4. Альтернативные методы: str_split, array_pop и циклы

Иногда полезно знать нестандартные подходы. Вот ещё несколько способов получить последний символ:

4.1. Через str_split() и array_pop()

<?php
$string = "PHP";
$chars = str_split($string);
$lastChar = array_pop($chars);
echo $lastChar; // "P"
?>

Минус: создаёт массив, что неэффективно для длинных строк. Плюс: наглядно и понятно новичкам.

4.2. Через цикл (для любителей велосипедов)

<?php
$string = "Loop";
$lastChar = '';
for ($i = 0; $i < strlen($string); $i++) {
    $lastChar = $string[$i];
}
echo $lastChar; // "p"
?>

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

4.3. Прямой доступ по индексу (только для однобайтовых строк)

<?php
$string = "Test";
$lastChar = $string[strlen($string) - 1];
echo $lastChar; // "t"
?>

Работает, но не поддерживает UTF-8. Если в строке есть кириллица — получите битый символ.

5. Частые ошибки и как их избежать

Опытные разработчики тоже иногда ошибаются. Вот топ-3 проблемы, с которыми сталкиваются даже профи:

Ошибка 1: Забыть про пустую строку

<?php
$string = "";
$lastChar = substr($string, -1);
var_dump($lastChar); // false — пустая строка возвращает false
?>

Решение: всегда проверяйте длину строки перед извлечением:

<?php
$string = "";
$lastChar = ($string !== '') ? mb_substr($string, -1, 1, 'UTF-8') : '';
echo $lastChar; // ""
?>

Ошибка 2: Игнорирование кодировки в многобайтовых функциях

<?php
$string = "Привет";
$lastChar = mb_substr($string, -1); // Без кодировки
echo $lastChar; // Может вывести "т", а может "?"
?>

Всегда указывайте кодировку явно: mb_substr($string, -1, 1, 'UTF-8').

Ошибка 3: Использование substr() для строк с эмодзи

<?php
$string = "Привет 😊";
$lastChar = substr($string, -1);
echo $lastChar; // Часть эмодзи — битый символ
// Правильно: mb_substr($string, -1, 1, 'UTF-8') вернёт 😊
?>

6. Производительность

Блоги

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