826

What is fastest way to remove the last character from a string?

I have a string like

a,b,c,d,e,

I would like to remove the last ',' and get the remaining string back:

OUTPUT: a,b,c,d,e

What is the fastest way to do this?

mickmackusa
  • 43,625
  • 12
  • 83
  • 136
I-M-JM
  • 15,732
  • 26
  • 77
  • 103
  • 39
    if this string is concanating by a loop, you can use "implode" it will be concated without last comma – Tufan Barış Yıldırım Apr 08 '11 at 09:24
  • 1
    @Tufan Barış Yıldırım: string concatenation is not in loop – I-M-JM Apr 08 '11 at 09:34
  • 9
    Please don't worry about "fastest" without having first done some sort of measurement that it matters. Rather than worrying about fastest, think about which way is clearest. – Andy Lester Sep 18 '13 at 16:55
  • Or you can find the fastest and add a comment, then you get speed, clarity and no worries. – DaveWalley Apr 11 '14 at 16:33
  • 5
    This should not be marked as a duplicate as the other question states that you know what the last character is ('a period'). – FruitBreak Aug 05 '14 at 16:04
  • 1
    @FruitBreak No its correctly marked as you can see by which answer I-M-JM accepted. It is again `trim()`. So he means "How to remove last specific characters from string?" and not "the last". All other answers are "wrong" by that. The only wrong duplicate marking has [this question](http://stackoverflow.com/q/6636491/318765). – mgutt Apr 02 '15 at 09:53
  • It would be appreciated IF when marking a string as duplicate - you added a link to where the answer is that this thread is a duplicate of. – Chezshire Jun 12 '15 at 18:13
  • Related http://stackoverflow.com/questions/31632379/how-can-i-remove-a-character-at-position – Gottlieb Notschnabel Jul 26 '15 at 00:52
  • This doesn't seem to be a duplicate. The suggested dupe-target is about *conditionally* removing characters (the title and accepted answer indicate that *multiple* characters may be removed); this is about unconditionally removing a single character, and adds the aspect of *performance*. – Kyle Strand Sep 27 '18 at 12:19
  • The "dupe" asks "*How to remove all specific characters at the end of a string?*" which is not the same as "*Remove the last character from string*". Although similar, this question is different. Voting to reopen. – But those new buttons though.. Apr 25 '19 at 02:16
  • From 2009: [How do I remove a comma off the end of a string?](https://stackoverflow.com/q/1642698/2943403) From 2010: [Php how to remove any last commas](https://stackoverflow.com/q/3120398/2943403) From 2010 [How can I easily remove the last comma from an array?](https://stackoverflow.com/q/3784306/2943403) – mickmackusa Aug 18 '22 at 08:09

7 Answers7

1321

Contrary to the question asked, rtrim() will remove any number of characters, listed in the second argument, from the end of the string. In case you expect just a single comma, the following code would do:

$newarraynama = rtrim($arraynama, ",");

But in my case I had 2 characters, a comma and a space, so I had to change to

$newarraynama = rtrim($arraynama, " ,");

and now it would remove all commas and spaces from the end of the string, returning a, b, c, d, e either from a, b, c, d, e,, a, b, c, d, e,,,, a, b, c, d, e, or a, b, c, d, e , ,, , ,

But in case there could be multiple commas but you need to remove only the last one, then rtrim() shouldn't be used at all - see other answers for the solution that directly answers the question.

However, rtrim() could be a good choice if you don't know whether the extra character could be present or not. Unlike substr-based solutions it will return a, b, c, d, e from a, b, c, d, e

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
  • 5
    How? Can you provide a kind of example – I-M-JM Apr 08 '11 at 09:17
  • 4
    @I-M Just replace `$string` by your data, and echo the whole thing: `echo rtrim("a,b,c,d,e,", ",");` –  Apr 08 '11 at 09:18
  • 61
    Note that this does not answer the question as posted in the title. – DaveWalley Apr 11 '14 at 16:39
  • thank you :) For More information please check [TRIM](http://php.net/manual/en/function.trim.php) & [RTRIM](http://php.net/manual/en/function.rtrim.php) & [LTRIM](http://php.net/manual/en/function.ltrim.php) – Rahul Mandaliya Sep 05 '14 at 09:27
  • A pity that there is no possibility for limiting the amount. If you think so too vote here: https://bugs.php.net/bug.php?id=49007 – Wilt Sep 12 '14 at 12:05
  • Of all the great answers supplied, this is the most elegant, since if for some reason the last character is not a comma it will not delete it. I learned from the other answers that substr and substr_replace take negative values. I had to look it up. thanks to all – sdfor Oct 27 '14 at 19:50
  • 10
    Note that this is a dangerous way to remove the extra comma at the end of a CSV string (a quite common issue when concatenating values in a loop). This would indeed turn `A;B;C;D;` to `A;B;C;D`, but will also transform `A;B;;;` to `A;B`. Often one wants to preserve the delimiters between empty values, because a CSV parser could need to determine the number of fields from the string itself. – etuardu Jan 13 '15 at 19:51
  • Hi, I know this post was already old but how about if the string `a,b,c,d & e` was in a while loop that retrieved from a `database`? I mean something like this: `while($rows = mysql_fetch_assoc($query)){ $letters = $rows['letters']; $let = "$letters,"; echo rtrim($let, ","); }` – Archie Zineg Feb 11 '15 at 04:16
  • It's worth noticing that `rtrim` isn't limited to single characters, it can remove a trailing chain if asked (e.g. `rtrim($string, "
    ")`).
    – Skippy le Grand Gourou Aug 08 '15 at 15:41
  • trim would also delete any commas at the start – J3STER Mar 07 '18 at 04:24
  • This is nonsense. `rtrim($s, ',')` works fine. No need to add a blank space, just make sure to trim your input before – masroore Jun 07 '22 at 09:00
1108

You can use substr:

echo substr('a,b,c,d,e,', 0, -1);
# => 'a,b,c,d,e'

This isolates the string from the start upto and including the second last character. In other words, it isolates the whole string except the last character.

In case the last character could be multi-byte, then mb_substr() should be used instead.

mickmackusa
  • 43,625
  • 12
  • 83
  • 136
Nicola Peluchetti
  • 76,206
  • 31
  • 145
  • 192
  • 33
    This is the good way. I wanted to remove last comma from a string like: "a,b,c,d,," and this is the correct solution because if you use rtrim() it will remove the two last comma. – serfer2 Oct 15 '13 at 08:24
  • This worked very well for me, very great method, had no idea you could use a negative number there and start from 0. I agree with the above comment, this is far better than rtrim, I had a similar issue where I didn't want to remove the last characters but a word from an SQL string at the END of the string only like " AND ", so I used this with substr("sqlstatement", 0, -7); to remove the last AND in the sequence of WHERE AND clauses I was writing. Worked like a charm :). – Joseph Astrahan Nov 08 '13 at 07:49
  • If you know the number of characters that you want to remove, this is the better answer. http://solidlystated.com/scripting/php-best-way-to-remove-last-character/ – ntrrobng Aug 26 '14 at 05:22
  • 4
    `trim` and `rtrim` do not remove the last character in a string. Although sometimes that is all they do, they will often remove many characters from the string. e.g. `rtrim('Assess','s')` gives you 'Asse', not 'Asses'. That's why this answer is better than the accepted answer. – Buttle Butkus Mar 20 '15 at 04:52
  • tried this script, and i think it works way better in the sense that removes the trailing character, being a comma or another weird ASCII thing.... – Pablo Contreras Dec 03 '15 at 17:59
  • Although Anon's answer works exactly as expected and desired for any MySQL query using lists, Nicola's answer properly answers the question as asked as well as drops any undesired last character. – Bad_Neighbor Feb 16 '17 at 04:12
  • substr($string,0,-1); – Võ Minh Nov 28 '18 at 07:35
  • 2
    The code is faulty, use this instead: `$substring = substr($string, 0, strlen($string)-1);` – Unterbelichtet Jan 16 '21 at 16:35
  • I agree, should this not be `strlen($string)-1` instead of -1 ? – Adam Jul 12 '21 at 12:45
119

An alternative to substr is the following, as a function:

substr_replace($string, "", -1)

Is it the fastest? I don't know, but I'm willing to bet these alternatives are all so fast that it just doesn't matter.

Note that this function is not multibyte-safe, and will produce the undesired result if the last character will happen to be a multi-byte one.

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
bart
  • 7,640
  • 3
  • 33
  • 40
  • 4
    the problem with "so fast, it doesn't matter" is, that it may be in a loop. Imagine, that code is executed 50 times for every single letter in a long text. Suddenly every little bit of performance counts. – Till Jun 07 '17 at 14:11
  • 1
    @Till I'm not sure if it works like that, I didn't check the source but I assume that [`substr_replace($str, $replacement, $start[, $length])`](http://php.net/manual/en/function.substr-replace.php) last couple of parameters limit the letters that are "surgically interventioned". I.e. _[`substr`](http://php.net/manual/en/function.substr.php)inging_ will only analyze/replace the substring's characters (in this case emptied). After this is done, the rest of the unaltered string is concatenated. – CPHPython Aug 09 '18 at 10:03
18

You can use

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

See substr in the PHP documentation. It returns part of a string.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Bas van Ommen
  • 1,243
  • 2
  • 12
  • 20
5

Use the regular expression end of string anchor "$"

$string = preg_replace("/,$/", '', $string);
Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
jxwd
  • 179
  • 2
  • 6
  • Surprisingly, I like this one for being meticulously correct: it will remove only a comma, only being the last character, and only if present – Your Common Sense Jun 20 '22 at 15:15
1

if you do you really want to replace a last char:

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

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

echo $string; //output: a,b,c,d,e
Edgaras
  • 404
  • 2
  • 16
-1

"The fastest best code is the code that doesn't exist".

Speaking of edge cases, there is a quite common issue with the trailing comma that appears after the loop, like

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

which, I suppose, also could be the case in the initial question. In this case, the fastest method definitely would be not to add the trailing comma at all:

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

here we are checking whether $str has any value already, and if so - adding a comma before the next item, thus having no extra commas in the result.

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
  • 2
    I love this answer, the solution does not remove the last character from a string YES. But based on the question trailing commas in a loop is most likely the reason you may want to remove the last character so why not use a better algorithm and you wont have to be worried about removing the last character – Samuel Silas Jun 19 '22 at 11:46