Как получить последний символ строки в PHP?


476

Мне нужно получить последний символ строки. Скажем, у меня есть «тестеры» в качестве входной строки, и я хочу, чтобы результат был «s». как я могу сделать это в PHP?


Вы могли бы найти s($str)->end()полезным, как найти в этой автономной библиотеке .
кар

Ответы:


993
substr("testers", -1); // returns "s"

Или для многобайтовых строк:

substr("multibyte string…", -1); // returns "…"

114
Если вы используете многобайтовые кодировки символов, такие как UTF-8, используйте вместо этого mb_substr( php.net/mb_substr ).
Гамбо

9
так много для моего substr ($ string, strlen ($ string) -1, 1) ;. Кажется, я проделал длинный путь вокруг!
Джеффки

4
Вам нужны только многобайтовые строковые функции, если строка оценивается как двоичная строка. Ака, когда php не знает кодировку. В противном случае типичные не многобайтовые строковые функции будут работать просто отлично.
Рэй Фосс


70

Или с помощью прямого доступа к строке :

$string[strlen($string)-1];

Обратите внимание, что это не работает для многобайтовых строк. Если вам нужно работать с многобайтовой строкой, рассмотрите возможность использования mb_*семейства функций string.

Начиная с PHP 7.1.0 также поддерживаются отрицательные числовые индексы, например, просто $string[-1];


2
Мне нравится этот ответ в стиле C, я удивляюсь, почему у этого есть только несколько голосов.
Валентин Мерсье

16
@ValentinMercier: Потому что это вопрос PHP, а не C.
Мартин Тома

1
Я думаю, что это лучшее решение, потому что оно позволяет вам модифицировать символ, в то время как решение substr, приведенное выше, этого не делает.
cazort

Обратите внимание, что это выдаст уведомление, если строка пуста.
Скотт Бьюкенен

40

Из PHP 7.1 вы можете сделать это ( Принято rfc для отрицательных смещений строк ):

<?php
$silly = 'Mary had a little lamb';
echo $silly[-20];
echo $silly{-6};
echo $silly[-3];
echo $silly[-15];
echo $silly[-13];
echo $silly[-1];
echo $silly[-4];
echo $silly{-10};
echo $silly[-4];
echo $silly[-8];
echo $silly{3}; // <-- this will be deprecated in PHP 7.4
die();

Я позволю вам угадать вывод.

Кроме того, я добавил это к коду производительности ксенонита со следующими результатами:

substr () занял 7.0334868431091секунд

доступ к массиву занял 2,3111131191254 секунд

Прямой доступ к строке (отрицательные смещения строки) занял 1.7971360683441секунд


Спасибо за публикацию тестов! Если кто-то заинтересован в тестах C # для того же, эта страница - хорошее чтение. Прямой доступ к последнему выигранному персонажу.

Не могли бы вы объяснить больше о разнице между [] и {} в этом контексте?
Тауфик Нур Рахманда

2
@TaufikNurRahmanda Технически нет разницы между [] и {}. Разработчики PHP дали возможность использовать либо. Для получения более подробной информации смотрите: php.net/manual/en/migration71.new-features.php
RyanNerd

что такое доступ к массиву и что такое прямой доступ к строкам? @RyanNerd afaik это две одинаковые вещи, нет?
КТ.

1
$ string {1} будет устаревшим в PHP 7.4 (RFC: wiki.php.net/rfc/deprecate_curly_braces_array_access )
Тони Влчек,

17

Я не могу оставлять комментарии, но в отношении ответа FastTrack, также помните, что конец строки может быть только один символ. Я бы предложил

substr(trim($string), -1)

РЕДАКТИРОВАТЬ: Мой код ниже был отредактирован кем-то, чтобы он не делал то, что я указал. Я восстановил свой исходный код и изменил формулировку, чтобы сделать его более понятным.

trim(или rtrim) удалит все пробелы, поэтому, если вам нужно проверить пробел, табуляцию или другие пробелы, сначала вручную замените различные окончания строк:

$order = array("\r\n", "\n", "\r");
$string = str_replace($order, '', $string);
$lastchar = substr($string, -1);

12

Начиная с PHP 7.1.0, отрицательные смещения строк также поддерживаются. Итак, если вы идете в ногу со временем, вы можете получить доступ к последнему символу в строке, например так:

$str[-1]

DEMO

По просьбе @mickmackusa я дополняю свой ответ возможными способами применения:

<?php

$str='abcdef';
var_dump($str[-2]); // => string(1) "e"

$str[-3]='.';
var_dump($str);     // => string(6) "abc.ef"

var_dump(isset($str[-4]));  // => bool(true)

var_dump(isset($str[-10])); // => bool(false)

Использование отрицательных смещений было техникой, упомянутой много лет назад RyanNerd. Пожалуйста, оставляйте ответ только тогда, когда у вас есть уникальные и ценные идеи, которыми вы можете поделиться.
mickmackusa

@mickmackusa Почему ты написал это только мне и проигнорировал множественные варианты substr ()?
нектобит

Ничего личного, я просто увидел твой очень короткий и излишний ответ и решил дать свисток. Не стесняйтесь сообщать другие ответы, если вы чувствуете, что они не добавляют никакой ценности. Имейте в виду, что два ответа могут предложить одну и ту же технику, но оба могут быть индивидуально ценными из-за объяснения. Это место обучения и расширения возможностей - добавление уникальных идей к ранее предложенным решениям может быть весьма полезным для исследователей.
mickmackusa

Например, мой ответ был опубликован через месяц после того же метода. Я собирался написать комментарий под предыдущим ответом, но, поскольку я напечатал всю информацию, которую я хотел предложить, это было явно слишком много, чтобы разумно комментировать. Я опубликовал новый ответ и добавил множество дополнительных идей и справочной информации о технике, а также включил тест. Вот как неуникальное решение может быть полезным для исследователей.
Mickmackusa

5

Я бы посоветовал перейти к решению Гордона, так как оно более производительно, чем substr ():

<?php 

$string = 'abcdef';
$repetitions = 10000000;

echo "\n\n";
echo "----------------------------------\n";
echo $repetitions . " repetitions...\n";
echo "----------------------------------\n";
echo "\n\n";

$start = microtime(true);
for($i=0; $i<$repetitions; $i++)
    $x = substr($string, -1);

echo "substr() took " . (microtime(true) - $start) . "seconds\n";

$start = microtime(true);
for($i=0; $i<$repetitions; $i++)
    $x = $string[strlen($string)-1];

echo "array access took " . (microtime(true) - $start) . "seconds\n";

die();

выводит что-то вроде

 ---------------------------------- 
 10000000 repetitions...
 ----------------------------------

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds

2
Это должен быть комментарий к ответу Гордона.
Гусь

1
Можете это подтвердить. Чем длиннее ваша строка, тем больше разница в производительности. В моем тесте с 10 символами substr медленнее примерно на 20%
Филипп

Не удивительно, так как substr () имеет накладные расходы при вызове функции, а другая - это прямое манипулирование строкой типа «C». Кстати, я запустил этот код на PHP 7.1-dev с результатами: substr () занял 7.090255022049секунд \ доступ к массиву занял 2.3145787715912секунд
RyanNerd

4

Помните, что если у вас есть строка, которая была прочитана как строка из текстового файла с использованием fgets()функции, вам нужно использовать ее substr($string, -3, 1)так, чтобы вы получали реальный символ, а не часть CRLF (перевод строки возврата каретки).

Я не думаю, что человек, который задал вопрос, нуждался в этом, но для меня у меня были проблемы с получением последнего символа из строки из текстового файла, поэтому я уверен, что другие столкнутся с подобными проблемами.


2

Вы можете найти последний символ, используя php разными способами, например substr () и mb_substr () .

Если вы используете многобайтовые кодировки символов, такие как UTF-8, используйте mb_substr вместо substr

Здесь я могу показать вам оба примера:

<?php
    echo substr("testers", -1);
    echo mb_substr("testers", -1);
?>

LIVE DEMO


1

Строка на разных языках, включая C sharp и PHP, также считается массивом символов.

Зная, что в теории операции с массивами должны выполняться быстрее строковых,

$foo = "bar";


$lastChar = strlen($foo) -1;
echo $foo[$lastChar];

$firstChar = 0;
echo $foo[$firstChar];

Тем не менее, стандартные функции массива, такие как

count();

не будет работать на строке.


-3

Siemano, получите только php файлы из выбранной директории:

$dir    = '/home/zetdoa/ftp/domeny/MY_DOMAIN/projekty/project';
$files = scandir($dir, 1);


foreach($files as $file){
  $n = substr($file, -3);
  if($n == 'php'){
    echo $file.'<br />';
  }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.