Як отримати останній символ рядка в 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 ).
Gumbo

9
стільки за мій substr ($ string, strlen ($ string) -1, 1) ;. Здається, я пройшов довгий шлях!
jeffkee

4
Функції багатобайтових рядків потрібні лише в тому випадку, якщо рядок оцінюється як двійковий рядок. Ака, коли php не знає кодування. Інакше типові небайтові рядкові функції будуть працювати чудово.
Рей Фосс


70

Або прямим доступом до рядків :

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

Зауважте, що це не працює для багатобайтових рядків. Якщо вам потрібно працювати з багатобайтовим рядком, розгляньте можливість використання mb_*сімейства рядків функцій.

Станом на PHP 7.1.0 також підтримуються негативні числові показники, наприклад просто $string[-1];


2
Мені подобається ця відповідь у стилі C, мені цікаво, чому це отримало лише декілька результатів.
Валентин Мерсьє

16
@ValentinMercier: Тому що це питання PHP, а не C.
Мартін Тома

1
Я думаю, що це краще рішення, оскільки воно дозволяє змінити характер, тоді як рішення субстр, наведене вище, не робить.
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 - це дві речі, ні?
КТ.


17

Я не можу залишати коментарі, але стосовно відповіді FastTrack також пам’ятайте, що закінчення рядка може мати лише один символ. Я б запропонував

substr(trim($string), -1)

EDIT: Мій код нижче хтось відредагував, і він не робив те, що я вказав. Я відновив свій початковий код і змінив формулювання, щоб зробити його більш зрозумілим.

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)

Використання негативних компенсацій було технікою, про яку згадував рік раніше РайанНерд. Будь ласка, опублікуйте відповідь лише тоді, коли у вас є унікальні та цінні відомості, якими слід поділитися.
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 символами субстр є приблизно на 20% повільніше
Філіп

Не дивно, що substr () має накладні витрати функціонального виклику, а інша - це "C like" маніпуляція з рядком. BTW Я запустив цей код на PHP 7.1-dev з результатами: substr () зайняв 7.090255022049секунд \ доступ до масиву зайняв 2.3145787715912секунд
RyanNerd

4

Пам'ятайте, що якщо у вас є рядок, який читався у вигляді рядка з текстового файлу за допомогою fgets()функції, вам потрібно скористатисяsubstr($string, -3, 1) таким чином, щоб ви отримали фактичний символ, а не частина CRLF (Feed Return Feed Line).

Я не думаю, що людині, яка поставила запитання, це було потрібно, але для мене у мене виникли проблеми з отриманням останнього символу з рядка з текстового файлу, тому я впевнений, що у інших виникнуть подібні проблеми.


2

Останнього символу можна знайти за допомогою php багатьма способами, як substr () та mb_substr () .

Якщо ви використовуєте багатобайтові кодування символів, такі як UTF-8, використовуйте mb_substr замість substr

Тут я можу показати вам обидва приклади:

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

LIVE DEMO


1

Рядок різними мовами, включаючи C shar та 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.