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


Answers:


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

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

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

114
如果您使用的是UTF-8等多字节字符编码,请改用mb_substrphp.net/mb_substr)。
浓汤

9
对于我的substr($ string,strlen($ string)-1,1);来说太多了。似乎我走了很长一段路!
jeffkee 2014年

4
如果字符串被评估为二进制字符串,则仅需要多字节字符串函数。又名,当php不知道编码时。否则,典型的非多字节字符串函数将可以正常工作。
雷·福斯


70

或通过直接字符串访问

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

请注意,这不适用于多字节字符串。如果需要使用多字节字符串,请考虑使用mb_*字符串函数系列。

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


2
我喜欢这个C风格的答案,我不知道为什么为什么只有这么少的票数。
Valentin Mercier 2014年

16
@ValentinMercier:因为这是一个PHP问题,而不是C。–
Martin Thoma

1
我认为这是一个更好的解决方案,因为它允许您修改字符,而上面给出的substr解决方案则不允许。
cazort

请注意,如果字符串为空,这将引发通知。
Scott Buchanan

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

我让你猜输出。

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

substr()花了7.0334868431091秒

阵列存取耗时2.3111131191254秒

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


感谢您发布基准测试!如果有人对做相同事情的C#基准测试感兴趣,那么此页面将是不错的阅读。直接访问最后一个字符赢了。

您能否在此背景下详细说明[]和{}之间的区别?
Taufik Nur Ra​​hmanda

2
@TaufikNurRahmanda从技术上讲,[]和{}之间没有区别。PHP开发人员可以选择使用其中一种。有关更多详细信息,请参见:php.net/manual/en/migration71.new-features.php
RyanNerd

什么是数组访问,什么是直接字符串访问?@RyanNerd afaik这些是2件事,不是吗?
CT。

1
$ string {1}将在PHP 7.4中弃用(RFC:wiki.php.net/rfc/deprecate_curly_braces_array_access
Tony

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]

演示

应@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()的多种变化?
nektobit

没什么私人的,我只是看到你的简短而冗长的答案,并决定吹口哨。如果您觉得其他答案没有任何价值,请随意举报。请记住,两个答案可能暗示着相同的技术,但由于所解释的内容,两个答案都各自有价值。这是一个教育和授权的地方-在以前提供的解决方案中添加独特的见解对研究人员而言可能非常有价值。
mickmackusa

例如,我的答案是在发布相同技术的一个月后发布的。我打算在较早的答案下写评论,但是当我键入要提供的所有信息时,显然太过明智了。我发布了一个新答案,并添加了有关该技术的大量免费见解和背景信息,并提供了一个基准。这就是非唯一解决方案对研究人员有价值的方式。
mickmackusa

5

我建议您使用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

2
这应该是对戈登答案的评论。

1
可以确认这一点。字符串越长,性能差异越大。在我的10个字符的测试中,substr慢了大约20%
Philipp

不足为奇,因为substr()具有函数调用的开销,另一个是“类似于C的”直接字符串操作。顺便说一句,我在PHP 7.1-dev上运行了这段代码,结果是:substr()花了7.090255022049seconds \数组访问花了2.3145787715912seconds
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);
?>

现场演示


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 />';
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.