Разделение строк в PHP и получение последней части

Мне нужно разбить строку в PHP на "-" и получить последнюю часть.

Итак, из этого:

ABC-123-хуг-789

Я ожидаю получить

"789"

Это код, который я придумал:

substr(strrchr($urlId, '-'), 1)

который отлично работает, за исключением:

Если моя строка ввода не содержит "-", я должен получить целую строку, например:

123

Мне нужно вернуться

123

и это должно быть как можно быстрее. Любая помощь приветствуется!

Ответ 1

split($pattern,$string) разбиение строк в заданном шаблоне или регулярном выражении (не рекомендуется с 5.3.0)

preg_split($pattern,$string) разбивает строки в заданном шаблоне регулярных выражений

разбить explode($pattern,$string) разделить строки в пределах данного шаблона

end($arr) получить последний элемент массива

Так:

end(split('-',$str))

end(preg_split(' / -/',$str))

$strArray = explode('-',$str)
$lastElement = end($strArray)

Вернет последний элемент - разделенной строки.


И есть хардкорный способ сделать это:

$str = '1-2-3-4-5';
echo substr($str, strrpos($str, '-') + 1);
//      |            '--- get the last position of '-' and add 1(if don't substr will get '-' too)
//      '----- get the last piece of string after the last occurrence of '-'

Ответ 2

$string = 'abc-123-xyz-789';
$exploded = explode('-', $string);
echo end($exploded);

EDIT:: Наконец-то удалось удалить проблему E_STRICT

Ответ 3

Просто проверьте, существует ли разделительный символ или нет или нет:

if (strpos($potentiallyDelimitedString, '-') !== FALSE) {
  found delimiter, so split
}

Ответ 4

Этот код сделает это

<?php
$string = 'abc-123-xyz-789';
$output = explode("-",$string);
echo $output[count($output)-1];
?>

Ответ 5

Как уже упоминалось другими, если вы не присвоите результат переменной explode() переменной, вы получите сообщение:

E_STRICT: Строгие стандарты: только переменные должны передаваться по ссылке

Правильный способ:

$words = explode('-', 'hello-world-123');
$id = array_pop($words); // 123
$slug = implode('-', $words); // hello-world

Ответ 6

Так как explode() возвращает массив, вы можете добавить квадратные скобки непосредственно в конец этой функции, если вам известно положение последнего элемента массива.

$email = '[email protected]';
$provider = explode('@', $email)[1];
echo $provider; // example.com

Или другим способом является list():

$email = '[email protected]';
list($prefix, $provider) = explode('@', $email);
echo $provider; // example.com

Если вы не знаете позицию:

$path = 'one/two/three/four';
$dirs = explode('/', $path);
$last_dir = $dirs[count($dirs) - 1];
echo $last_dir; // four

Ответ 8

Чтобы удовлетворить требование, что "это должно быть как можно быстрее", я провел сравнительный анализ некоторых возможных решений. Каждое решение должно было удовлетворять этому набору тестов.

$cases = [
    'aaa-zzz'                     => 'zzz',
    'zzz'                         => 'zzz',
    '-zzz'                        => 'zzz',
    'aaa-'                        => '',
    ''                            => '',
    'aaa-bbb-ccc-ddd-eee-fff-zzz' => 'zzz',
];

Вот решения:

function test_substr($str, $delimiter = '-') {
    $idx = strrpos($str, $delimiter);
    return $idx === false ? $str : substr($str, $idx + 1);
}

function test_end_index($str, $delimiter = '-') {
    $arr = explode($delimiter, $str);
    return $arr[count($arr) - 1];
}

function test_end_explode($str, $delimiter = '-') {
    $arr = explode($delimiter, $str);
    return end($arr);
}

function test_end_preg_split($str, $pattern = '/-/') {
    $arr = preg_split($pattern, $str);
    return end($arr);
}

Вот результаты после того, как каждое решение было выполнено в тестовых случаях 1 000 000 раз:

test_substr               : 1.706 sec
test_end_index            : 2.131 sec  +0.425 sec  +25%
test_end_explode          : 2.199 sec  +0.493 sec  +29%
test_end_preg_split       : 2.775 sec  +1.069 sec  +63%

Оказывается, самым быстрым из них было использование substr с strpos. Обратите внимание, что в этом решении мы должны проверить strpos на false чтобы мы могли вернуть полную строку (удовлетворяя случай zzz).

Ответ 9

Вы можете использовать array_pop в сочетании с explode

код:

$string = 'abc-123-xyz-789';
$output = array_pop(explode("-",$string));
echo $output;

DEMO: Нажмите здесь

Ответ 10

Вы можете сделать это так:

$str = "abc-123-xyz-789";
$arr = explode('-', $str);
$last = array_pop( $arr );
echo $last; //echoes 789

Ответ 11

Вы можете сделать это следующим образом:

$str = "abc-123-xyz-789";
$last = array_pop( explode('-', $str) );
echo $last; //echoes 789