如何在PHP中获取字符串的最后一个字符?

570

我需要获取字符串的最后一个字符。假设我的输入字符串为 "testers",我希望结果是 "s"。在PHP中如何实现?


你可能会发现s($str)->end()很有用,它可以在这个独立库中找到。 - caw
13个回答

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

或者,对于多字节字符串:

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

131
如果你正在使用像UTF-8这样的多字节字符编码,请使用mb_substr(http://php.net/mb_substr)代替。 - Gumbo
12
这就是我的 substr($string, strlen($string)-1, 1);。看来我绕了很长的路! - jeffkee
6
只有在字符串被视为二进制字符串时,才需要使用多字节字符串函数。也就是说,在 PHP 不知道编码的情况下。否则,通常的非多字节字符串函数就可以正常工作。 - Ray Foss
请参考Yes Barry的回答。从PHP 8开始,您可以使用str_ends_with()函数。 - Tim Rogers

96
substr($string, -1) 

79

或者使用直接字符串访问

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

请注意,这种方法不适用于多字节字符串。如果你需要处理多字节字符串,请考虑使用mb_*函数族。

从PHP 7.1.0开始,也支持负数索引,例如$string[-1];


3
我喜欢这个C语言风格的回答,但我不知道为什么只有这么少的赞。 - Valentin Mercier
24
因为这是一个关于 PHP 的问题,而不是 C 语言。 - Martin Thoma
2
我认为这是一个更好的解决方案,因为它允许您修改字符,而上面给出的substr解决方案则不行。 - cazort
1
请注意,如果字符串为空,这将引发一个通知。 - Scott Buchanan

55

从 PHP 7.1 开始,您可以这样做(负字符串偏移的已接受请求):

<?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();

我会让你猜输出结果。

另外,我将这些结果添加到xenonite的性能代码中,结果如下:

substr()花费7.0334868431091秒

数组访问花费2.3111131191254秒

直接字符串访问(负字符串偏移)花费1.7971360683441秒


感谢您发布基准测试结果!如果有人对使用C#进行相同操作的基准测试感兴趣,这个页面是一个不错的参考阅读材料:http://cc.davelozinski.com/c-sharp/c-fastest-way-to-check-last-character-of-a-string。直接访问最后一个字符获胜了。 - user4023224
2
@TaufikNurRahmanda 从技术上讲,[]和{}之间没有区别。PHP开发人员提供了两种选项。有关更多详细信息,请参见:http://php.net/manual/en/migration71.new-features.php - RyanNerd
1
$string{1} 将在 PHP 7.4 中被弃用(RFC:https://wiki.php.net/rfc/deprecate_curly_braces_array_access) - Tony Vlcek
1
它拼错了 readablilty。我猜他的意思是 readability?是的,五年后,我很好奇哈哈。 - Wade
1
重要提示:当字符串为空时,它会抛出一个错误 PHP Notice: Uninitialized string offset: -1。因此,请在此之前进行检查。 - sdlins
显示剩余4条评论

37

从PHP 7.1.0开始,也支持负字符串偏移量。 因此,如果你跟上时代,你可以像这样访问字符串中的最后一个字符:

$str[-1]

演示

应@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
1
@mickmackusa 为什么你只写给我,而忽略了 substr() 的多种变体? - nektobit
1
没有个人恩怨,我只是看到了你非常简短和冗余的回答,决定吹哨。如果你觉得其他答案没有价值,可以自由地举报。请记住,两个答案可以提出相同的技术,但由于解释的不同而分别有价值。这是一个教育和赋权的场所——为以前提供的解决方案添加独特的见解可能对研究人员非常有价值。 - mickmackusa
2
例如,我的这个答案是在同样的技术被发表一个月后发布的。我本来想在早期的答案下写一条评论,但是当我打出我想要提供的所有信息时,显然这太多了,无法合理地评论。我发表了一个新的答案,并添加了许多补充见解和背景信息,包括基准测试。这就是一个非独特的解决方案如何对研究人员有价值的方法。 - mickmackusa
1
这应该被标记为答案。 - theking2

18

我不能留言,但关于FastTrack的回答,请记住行尾可能只有单个字符。我建议

substr(trim($string), -1)

编辑:我的下面的代码被某人编辑,导致它不能做我想做的事情。我已经恢复了我的原始代码,并更改了措辞以使其更清晰。

trim(或rtrim)将删除所有空格,因此如果您确实需要检查空格、制表符或其他空格,则先手动替换各种行结尾:

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

10
从 PHP 8 开始,您现在可以使用 str_ends_with()
$string = 'testers';
if (\str_ends_with($string, 's') {
    // yes
}

6

我建议选择Gordon的解决方案,因为它比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

3
这应该是对戈登回答的评论。 - Goose
1
可以确认这一点。你的字符串越长,性能差异就越大。在我的测试中,使用10个字符的substr函数要慢大约20%。 - Philipp
不足为奇,因为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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接