Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中拆分字符串并获取最后一部分_Php_String - Fatal编程技术网

在PHP中拆分字符串并获取最后一部分

在PHP中拆分字符串并获取最后一部分,php,string,Php,String,我需要在PHP中用“-”拆分一个字符串,然后得到最后一部分 因此: abc-123-xyz-789 我希望得到 “789” 这是我想出的代码: substr(strrchr($urlId, '-'), 1) 这很好,除了: 如果输入字符串不包含任何“-”,则必须获取整个字符串,如: 123 我得回去了 123 它需要尽可能快。 感谢您的帮助 只需检查定界字符是否存在,是否拆分: if (strpos($potentiallyDelimitedString, '-') !== FALSE) {

我需要在PHP中用“-”拆分一个字符串,然后得到最后一部分

因此:

abc-123-xyz-789

我希望得到

“789”

这是我想出的代码:

substr(strrchr($urlId, '-'), 1)
这很好,除了:

如果输入字符串不包含任何“-”,则必须获取整个字符串,如:

123

我得回去了

123

它需要尽可能快。
感谢您的帮助

只需检查定界字符是否存在,是否拆分:

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

您可以这样做:

$str = "abc-123-xyz-789";
$last = array_pop( explode('-', $str) );
echo $last; //echoes 789
$str = "abc-123-xyz-789";
$arr = explode('-', $str);
$last = array_pop( $arr );
echo $last; //echoes 789
编辑::终于开始着手删除E_STRICT问题

拆分($pattern,$string)
在给定模式或regex中拆分字符串(从5.3.0开始就不推荐使用)

preg\u split($pattern,$string)
在给定的正则表达式模式内拆分字符串

分解($pattern,$string)
在给定模式内拆分字符串

end($arr)
get last数组元素

因此:

end(拆分('-',$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 '-'

您可以将数组\u pop分解组合使用

代码:

演示

此代码将完成此操作

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

由于
explode()
返回一个数组,如果您碰巧知道最后一个数组项的位置,则可以将方括号直接添加到该函数的末尾

$email = 'name@example.com';
$provider = explode('@', $email)[1];
echo $provider; // example.com
或者另一种方法是
list()

如果您不知道该职位:

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


这在PHP5()中不会导致E_严格警告。尽管如此,在它前面添加
@
可以作为一种解决方法。

正如其他人所提到的,如果不将
explode()
的结果分配给变量,您会得到以下消息:

E_STRICT:严格标准:只能通过引用传递变量

正确的方法是:

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

为了满足“它需要尽可能快”的要求,我针对一些可能的解决方案运行了一个基准测试。每个解决方案都必须满足这组测试用例

$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);
}
以下是针对测试用例运行每个解决方案1000000次后的结果:

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
的情况)。

您可以这样做:

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

只需调用以下单行代码:

 $expectedString = end(explode('-', $orignalString));

接受的答案有一个bug,如果没有找到分隔符,它仍然会吃掉输入字符串的第一个字符

$str = '1-2-3-4-5';
echo substr($str, strrpos($str, '-') + 1);
生成预期结果:
5

$str = '1-2-3-4-5';
echo substr($str, strrpos($str, ';') + 1);
产生
-2-3-4-5

$str = '1-2-3-4-5';
if (($pos = strrpos($str, ';')) !== false)
    echo substr($str, $pos + 1);
else
    echo $str;
根据需要生成整个字符串


explode()
end()
end(split('-',$str))
您知道使用end()比array\u pop快还是有什么区别吗?
array\u pop
将从数组中删除最后一个元素并返回最后一个元素,
end
只返回最后一个元素。我认为没有性能差异。@Skarlinski如果没有必要,简单地不爆炸是最快的。难道“拆分”不被弃用吗?
end(explode('-',$str))
给出了以下错误:
Strict(2048):只有变量应该通过引用传递
。这解决了:它导致E\u严格:严格标准:只有变量应该通过引用传递它导致E\u严格:严格标准:只有变量应该通过引用传递它导致E\u严格:严格标准:只有变量应该通过引用传递我不知道人们为什么会这样想答案没用。谢谢,这对我来说很有用。《魔法与魔法》与《魔法与魔法》php7一起消失了。《魔法与魔法》实际上是一个重复的答案,但也是在5年前的一篇帖子上。这导致了一个错误,详情如所述。哦,使用
'-'
作为saperator,我使用了
'/'
。无论如何,我更正了我的代码。请现在检查。
$str = '1-2-3-4-5';
echo substr($str, strrpos($str, ';') + 1);
$str = '1-2-3-4-5';
if (($pos = strrpos($str, ';')) !== false)
    echo substr($str, $pos + 1);
else
    echo $str;