Удалить завершающий разделитель из строкового значения с разделителями
Заголовок: Как быстро удалить последний символ из строки?
Описание проблемы:
У меня есть строка, например:
a,b,c,d,e,
Мне нужно удалить последний символ (в данном случае запятую) и получить оставшуюся строку:
OUTPUT: a,b,c,d,e
Каков самый быстрый способ сделать это?
5 ответ(ов)
В отличие от заданного вопроса, функция 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
.
Альтернативой функции substr
может быть следующая реализация в виде функции:
substr_replace($string, "", -1);
Я не могу утверждать, что это решение является самым быстрым, но готов поспорить, что все указанные альтернативы работают так быстро, что это просто не имеет значения.
Обратите внимание, что эта функция не защищена от многобайтовых символов, и если последний символ окажется многобайтовым, результат будет нежелательным.
Вам нужно удалить запятую в конце строки? Для этого вы можете воспользоваться регулярным выражением с якорем конца строки "$"
. Вот пример использования функции preg_replace
для этой задачи:
$string = preg_replace("/,$/", '', $string);
В этом коде регулярное выражение "/,$/"
ищет запятую, которая находится в конце строки. Если такая запятая найдена, она будет заменена на пустую строку, effectively удаляя её.
Говоря об исключительных случаях, существует довольно распространённая проблема с завершающей запятой, которая появляется после цикла, когда мы получаем данные из некоторого потока:
$str = '';
while ($row = getRow()) {
$str .= $row['value'] . ",";
}
Как мне кажется, это также может быть актуально для первоначального вопроса. В этом случае самым быстрым решением определённо будет не добавлять завершающую запятую вовсе, используя флаг для этого:
$str = '';
$first = true;
while ($row = getRow()) {
if ($first) {
$first = false;
} else {
$str .= ",";
}
$str .= $row['value'];
}
Или, когда мы точно знаем, что первое значение не может быть пустым, мы можем использовать результирующую строку в качестве такого флага:
$str = '';
while ($row = getRow()) {
$str .= ($str !== '') ? "," : "";
$str .= $row['value'];
}
Здесь мы проверяем, есть ли уже какое-либо значение в переменной $str, и если да – добавляем запятую перед следующим элементом, таким образом избегая лишних запятых в результате.
Есть более продвинутый способ выполнить ту же задачу с использованием функций pack() и unpack(), если кому-то это интересно:
$testStr = 'a,b,c,d,e,';
$arr = unpack('C*', $testStr);
unset($arr[strlen($testStr)]);
echo $output = pack('C*', ...$arr);
Функция unpack используется для разбора бинарных данных в ассоциативный массив. Форматная строка C* в функции unpack позволяет интерпретировать входную строку как массив беззнаковых символов, что возвращает массив следующего вида:
Array ( [1] => 97 [2] => 44 [3] => 98 [4] => 44 [5] => 99 [6] => 44 [7] => 100 [8] => 44 [9] => 101 [10] => 44 )
Здесь 97 соответствует "a", а 44 — "," (знак запятой), что является ASCII кодом символа.
unpack('C*', $testStr);
C: Указывает, что данные представляют собой один байт (8 бит) и должны быть разбиты как беззнаковое целое. *: Указывает, что все байты во входной строке должны быть разобраны.
pack('C*', ...$arr);
С другой стороны, функция pack используется для упаковки данных в бинарную строку. При использовании с форматом C* функция pack принимает массив байтов (или целых чисел, представляющих байты) и упаковывает их в бинарную строку.
C: Указывает, что аргумент является беззнаковым символом (байт). *: Указывает, что все элементы массива должны быть упакованы.
unset($arr[strlen($testStr)]);
Функция unset удаляет последний элемент из массива. В данном случае это ','.
Надеюсь, это поможет!
UTF-8 на всех уровнях!
Сортировка двумерного массива по значению в столбце
Что такое потокобезопасность и непотокобезопасность в PHP?
Как передать переменные и данные из PHP в JavaScript?
Вставка нового элемента в массив в любом месте в PHP