Разделение строк в 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
Ответ 7
Как этот пост:
end((explode('-', $string)));
который не будет вызывать предупреждение E_STRICT в PHP 5 (PHP magic). Хотя предупреждение будет выпущено в PHP 7, поэтому добавление @
перед ним может быть использовано в качестве обходного пути.
Ответ 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