【发布时间】:2011-02-10 12:38:36
【问题描述】:
我需要获取字符串的最后一个字符。 假设我有“testers”作为输入字符串,我希望结果是“s”。我如何在 PHP 中做到这一点?
【问题讨论】:
-
您可能会发现
s($str)->end()很有帮助,如在 this standalone library 中找到的。
我需要获取字符串的最后一个字符。 假设我有“testers”作为输入字符串,我希望结果是“s”。我如何在 PHP 中做到这一点?
【问题讨论】:
s($str)->end() 很有帮助,如在 this standalone library 中找到的。
substr("testers", -1); // returns "s"
或者,对于多字节字符串:
substr("multibyte string…", -1); // returns "…"
【讨论】:
mb_substr (php.net/mb_substr)。
substr($string, -1)
【讨论】:
$string[strlen($string)-1];
请注意,这不适用于多字节字符串。如果您需要使用多字节字符串,请考虑使用mb_* string family of functions.
从 PHP 7.1.0 开始也支持负数索引,例如 $string[-1];
【讨论】:
从 PHP 7.1 开始,您可以这样做 (Accepted rfc for negative string offsets):
<?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's 性能代码中,结果如下:
substr() 耗时 7.0334868431091 秒
数组访问耗时 2.3111131191254 秒
直接字符串访问(负字符串偏移)耗时 1.7971360683441 秒
【讨论】:
readablilty。我猜他的意思是readability?是的,5 年后,我很好奇哈哈。
PHP Notice: Uninitialized string offset: -1。所以,之前检查一下。
从 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)
【讨论】:
我不能离开 cmets,但关于 FastTrack 的回答,还请记住,行尾可能只有单个字符。我会建议
substr(trim($string), -1)
编辑: 我下面的代码是由某人编辑的,所以它没有按照我的指示进行。我已经恢复了我的原始代码并更改了措辞以使其更清晰。
trim(或rtrim)将删除所有空格,因此如果您确实需要检查空格、制表符或其他空格,请先手动替换各种行尾:
$order = array("\r\n", "\n", "\r");
$string = str_replace($order, '', $string);
$lastchar = substr($string, -1);
【讨论】:
我建议使用 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
【讨论】:
请记住,如果您有一个使用 fgets() 函数从文本文件中读取为一行的字符串,则需要使用 substr($string, -3, 1) 以便获得实际字符而不是 CRLF 的一部分(回车换行)。
我认为提出问题的人不需要这个,但对我来说,我在从文本文件的字符串中获取最后一个字符时遇到了麻烦,所以我相信其他人也会遇到类似的问题。
【讨论】:
您可以通过多种方式使用 php 查找最后一个字符,例如 substr() 和 mb_substr()。
如果您使用 UTF-8 等多字节字符编码,请使用 mb_substr 而不是 substr
这里我可以给你看两个例子:
<?php
echo substr("testers", -1);
echo mb_substr("testers", -1);
?>
【讨论】:
不同语言(包括 C sharp 和 PHP)的字符串也被视为字符数组。
知道理论上数组操作应该比字符串操作更快,
$foo = "bar";
$lastChar = strlen($foo) -1;
echo $foo[$lastChar];
$firstChar = 0;
echo $foo[$firstChar];
然而,像
这样的标准数组函数count();
对字符串不起作用。
【讨论】:
使用带有负数的 substr() 作为第二个参数。$newstring = substr($string1, -1);
【讨论】:
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 />';
}
}
【讨论】: