从一个分隔的字符串中移除末尾的分隔符。

828

最快的方法是从字符串中删除最后一个字符?

我有一个像这样的字符串:

a,b,c,d,e,

我想删除最后一个',',并获取剩余的字符串:

OUTPUT: a,b,c,d,e

最快的方法是什么?


39
如果这个字符串是通过循环拼接的,你可以使用 "implode" 函数,它可以在不包含最后一个逗号的情况下进行拼接。 - Tufan Barış Yıldırım
1
@Tufan Barış Yıldırım:字符串拼接不在循环中。 - I-M-JM
9
请不要担心"最快",除非您已经进行了某种测量来证明它很重要。 与其担心速度最快的问题,不如考虑哪种方式更为清晰易懂。 - Andy Lester
5
这不应被标记为重复,因为另一个问题已经指明您知道最后一个字符是什么(“一个句点”)。 - FruitBreak
1
@FruitBreak 不,正如你可以看到I-M-JM接受的答案所示,它被正确标记了。这又是trim()。所以他的意思是“如何从字符串中删除最后特定的字符?”而不是“最后一个”。所有其他答案都是“错误”的。唯一错误的重复标记是这个问题 - mgutt
显示剩余6条评论
7个回答

1325
与所问问题相反,rtrim()将从字符串末尾删除第二个参数中列出的任意数量的字符。如果您只想去掉一个逗号,可以使用以下代码:
$newarraynama = rtrim($arraynama, ",");

但在我的情况下,我有两个字符,一个逗号和一个空格,所以我不得不改为:
$newarraynama = rtrim($arraynama, " ,");

现在它将从字符串末尾删除所有逗号和空格,无论是来自a, b, c, d, e,a, b, c, d, e,,,a, b, c, d, e, 还是a, b, c, d, e , ,, , ,,都会返回a, b, c, d, e

但是,如果可能有多个逗号,但您只需要删除最后一个,那么根本不应使用rtrim()——请参见其他答案以直接回答问题的解决方案。

然而,如果您不知道额外字符是否存在,rtrim()可能是一个不错的选择。与基于substr的解决方案不同,它将从a, b, c, d, e返回a, b, c, d, e


5
当然可以。以下是一个例子:英文原文: "Machine learning is a method of data analysis that automates analytical model building. It is a branch of artificial intelligence based on the idea that systems can learn from data, identify patterns and make decisions with minimal human intervention."翻译后的简洁中文: “机器学习是一种数据分析方法,它自动化了分析模型的构建。它是人工智能的一个分支,基于这样一个思想:系统可以通过数据学习、识别模式,并在最小的人类干预下做出决策。” - I-M-JM
4
请用你的数据替换 $string,然后输出整个内容: echo rtrim("a,b,c,d,e,", ","); - anon
61
请注意,这并不回答标题中所提出的问题。 - DaveWalley
请查看以下链接获取更多关于编程的信息: TRIM & RTRIM & LTRIM。谢谢! - Rahul Mandaliya
10
请注意,这是一种危险的方法来删除CSV字符串末尾的多余逗号(当在循环中连接值时,这是相当常见的问题)。这确实会将A;B;C;D;变为A;B;C;D,但也会将A;B;;;转换为A;B。通常希望保留空值之间的分隔符,因为CSV解析器可以需要从字符串本身确定字段数。 - etuardu
显示剩余6条评论

1110
你可以使用 substr 函数:
echo substr('a,b,c,d,e,', 0, -1);
# => 'a,b,c,d,e'

这个代码从头开始选择字符串到倒数第二个字符,也就是说,它选择整个字符串除了最后一个字符。

如果最后一个字符可能是多字节的,则应该使用mb_substr()


33
这是正确的方法。我想从像“a,b,c,d,,”这样的字符串中删除最后一个逗号,这是正确的解决方案,因为如果使用rtrim(),它将删除最后两个逗号。 - serfer2
这对我非常有效,非常好的方法,我不知道你可以在那里使用负数并从0开始。我同意上面的评论,这比rtrim要好得多。我有一个类似的问题,我不想删除最后几个字符,但是只想从SQL字符串末尾删除一个单词,比如"AND",所以我使用了这个函数substr(“ sqlstatement”,0,-7);来删除我正在编写的WHERE AND子句序列中最后一个AND。完美地工作:)。 - Joseph Astrahan
4
trimrtrim不会移除字符串中的最后一个字符。尽管有时它们只移除最后一个字符,但通常会从字符串中移除许多字符。例如,rtrim('Assess','s')会给出'Asse'而不是'Asses'。这就是为什么这个答案比被接受的答案更好的原因。 - Buttle Butkus
2
代码存在缺陷,请改用以下代码:$substring = substr($string, 0, strlen($string)-1); - Unterbelichtet
@Unterbelichtet正在Stack Overflow上散播错误信息。这个答案使用了最直接的substr()版本的证据:https://3v4l.org/HlsSS - undefined
显示剩余5条评论

119

下面是一个函数形式的替代 substr 的方法:

substr_replace($string, "", -1)

它是否最快?我不知道,但我愿意打赌这些替代方案都如此之快,以至于这根本无关紧要

请注意,该函数不支持多字节,并且如果最后一个字符恰好是多字节字符,则会产生不良结果。


4
“so fast, it doesn't matter” 的问题在于,它可能会形成一个循环。想象一下,代码针对长文本中的每个字母执行50次。突然间,每一点点性能都变得至关重要。 - Till
1
@Till 我不确定它是否像这样工作,我没有检查过源代码,但我假设substr_replace($str, $replacement, $start[, $length])的最后几个参数限制了被“手术干预”的字母。也就是说,_ substr_只会分析/替换子字符串的字符(在本例中为空)。完成此操作后,剩余未更改的字符串将被连接起来。 - CPHPython

18

你可以使用

substr(string $string, int $start, int[optional] $length=null);

请参考PHP文档中substr函数,它返回字符串的一部分。


1
抱歉,但这不是@ashleedawg给出的相同答案吗? - Salustiano Muniz
@SalustianoMuniz,没问题。我认为答案之间的时间差太短了。 - MAChitgarha

5

使用正则表达式字符串结尾锚点"$"

$string = preg_replace("/,$/", '', $string);

出乎意料的是,我喜欢这一个因其精细的正确性:它只会删除逗号,仅当它是最后一个字符,并且仅在存在时。 - Your Common Sense

-1

“最快的”代码是不存在的代码。

说到边界情况,循环后面出现逗号这一问题很常见,就像:

$str = '';
foreach ($array as $value) {
    $str .= "$value,";
}

我想,在初始的问题中也可能是这种情况。在这种情况下,最快的方法肯定是根本不要添加尾随逗号:

$str = '';
foreach ($array as $value) {
    $str .= $str ? "," : "";
    $str .= $value;
}

在这里,我们正在检查$str是否已经有任何值,如果是-在下一个项目之前添加逗号,从而在结果中没有额外的逗号。


2
我喜欢这个答案,该解决方案不会从字符串中删除最后一个字符YES。但是根据问题,在循环中的尾随逗号很可能是您想要删除最后一个字符的原因,那么为什么不使用更好的算法,这样您就不必担心删除最后一个字符了。 - Samuel Silas

-1

如果你真的想要替换最后一个字符:

$string = "a,b,c,d,e,";

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

echo $string; //output: a,b,c,d,e

这在我看来似乎是最快速且最少占用内存的解决方案? - medunes
从PHP8开始,这个答案会导致致命错误。致命错误:无法将空字符串分配给字符串偏移量 - undefined

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