【问题标题】:How to get the last char of a string in PHP?如何在 PHP 中获取字符串的最后一个字符?
【发布时间】:2011-02-10 12:38:36
【问题描述】:

我需要获取字符串的最后一个字符。 假设我有“testers”作为输入字符串,我希望结果是“s”。我如何在 PHP 中做到这一点?

【问题讨论】:

标签: php string


【解决方案1】:
substr("testers", -1); // returns "s"

或者,对于多字节字符串:

substr("multibyte string…", -1); // returns "…"

【讨论】:

  • 如果您使用 UTF-8 等多字节字符编码,请改用 mb_substr (php.net/mb_substr)。
  • 我的 substr($string, strlen($string)-1, 1); 这么多。看来我已经走了很长一段路!
  • 如果字符串被评估为二进制字符串,您只需要多字节字符串函数。又名,当 php 不知道编码时。否则,典型的非多字节字符串函数可以正常工作。
【解决方案2】:
substr($string, -1) 

【讨论】:

    【解决方案3】:

    direct string access

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

    请注意,这不适用于多字节字符串。如果您需要使用多字节字符串,请考虑使用mb_* string family of functions.

    从 PHP 7.1.0 开始也支持负数索引,例如 $string[-1];

    【讨论】:

    • 我喜欢这个 C 风格的答案,我想知道为什么这只有这么几个赞。
    • @ValentinMercier:因为这是一个 PHP 问题,而不是 C。
    • 我认为这是一个更好的解决方案,因为它允许您修改字符,而上面给出的 substr 解决方案却没有。
    • 请注意,如果字符串为空,这将引发通知。
    【解决方案4】:

    从 PHP 7.1 开始,您可以这样做 (Accepted rfc for negative string offsets):

    <?php
    $silly = 'Mary had a little lamb';
    echo $silly[-20];
    echo $silly{-6};
    echo $silly[-3];
    echo $silly[-15];
    echo $silly[-13];
    echo $silly[-1];
    echo $silly[-4];
    echo $silly{-10};
    echo $silly[-4];
    echo $silly[-8];
    echo $silly{3}; // <-- this will be deprecated in PHP 7.4
    die();
    

    我让你猜猜输出。

    此外,我将其添加到 xenonite's 性能代码中,结果如下:

    substr() 耗时 7.0334868431091 秒

    数组访问耗时 2.3111131191254 秒

    直接字符串访问(负字符串偏移)耗时 1.7971360683441 秒

    【讨论】:

    • 感谢发布基准!如果有人对做同样事情的 C# 基准测试感兴趣,this page 是一本不错的读物。直接访问最后一个字符胜出。
    • @TaufikNurRahmanda 从技术上讲,[] 和 {} 之间没有区别。 PHP 开发人员提供了使用其中任何一个的选项。更多详情见:php.net/manual/en/migration71.new-features.php
    • $string{1} 将在 PHP 7.4 中被弃用(RFC:wiki.php.net/rfc/deprecate_curly_braces_array_access
    • 它拼写为readablilty。我猜他的意思是readability?是的,5 年后,我很好奇哈哈。
    • 重要提示:当字符串为空时,会报错PHP Notice: Uninitialized string offset: -1。所以,之前检查一下。
    【解决方案5】:

    从 PHP 7.1.0 开始,还支持负字符串偏移量。 所以,如果你跟上时代的步伐,你可以像这样访问字符串中的最后一个字符:

    $str[-1]
    

    DEMO

    应@mickmackusa 的要求,我用可能的应用方式来补充我的答案:

    <?php
    
    $str='abcdef';
    var_dump($str[-2]); // => string(1) "e"
    
    $str[-3]='.';
    var_dump($str);     // => string(6) "abc.ef"
    
    var_dump(isset($str[-4]));  // => bool(true)
    
    var_dump(isset($str[-10])); // => bool(false)
    

    【讨论】:

    • 使用负偏移是 RyanNerd 多年前提到的一种技术。请仅在您有独特且有价值的见解要分享时才发布答案。
    • @mickmackusa 为什么只写给我而忽略了 substr() 的多个变体?
    • 没什么私人的,我只是看到你非常简短和多余的回答,决定吹我的口哨。如果您认为其他答案没有任何价值,请随时举报其他答案。请记住,两个答案可以暗示相同的技术,但由于所解释的内容,两者都具有单独的价值。这是一个教育和赋权的地方——为以前提供的解决方案添加独特的见解对研究人员来说非常有价值。
    • 例如,this answer of mine 是在发布相同技术一个月后发布的。我打算在之前的答案下写一个评论,但是当我输入我想提供的所有信息时,明智地评论显然太多了。我发布了一个新答案,并添加了许多关于该技术的免费见解和背景信息,并包含了一个基准。这就是非独特解决方案对研究人员的价值所在。
    【解决方案6】:

    我不能离开 cmets,但关于 FastTrack 的回答,还请记住,行尾可能只有单个字符。我会建议

    substr(trim($string), -1)
    

    编辑: 我下面的代码是由某人编辑的,所以它没有按照我的指示进行。我已经恢复了我的原始代码并更改了措辞以使其更清晰。

    trim(或rtrim)将删除所有空格,因此如果您确实需要检查空格、制表符或其他空格,请先手动替换各种行尾:

    $order = array("\r\n", "\n", "\r");
    $string = str_replace($order, '', $string);
    $lastchar = substr($string, -1);
    

    【讨论】:

      【解决方案7】:

      我建议使用 Gordon 的解决方案,因为它比 substr() 更高效:

      <?php 
      
      $string = 'abcdef';
      $repetitions = 10000000;
      
      echo "\n\n";
      echo "----------------------------------\n";
      echo $repetitions . " repetitions...\n";
      echo "----------------------------------\n";
      echo "\n\n";
      
      $start = microtime(true);
      for($i=0; $i<$repetitions; $i++)
          $x = substr($string, -1);
      
      echo "substr() took " . (microtime(true) - $start) . "seconds\n";
      
      $start = microtime(true);
      for($i=0; $i<$repetitions; $i++)
          $x = $string[strlen($string)-1];
      
      echo "array access took " . (microtime(true) - $start) . "seconds\n";
      
      die();
      

      输出类似

       ---------------------------------- 
       10000000 repetitions...
       ----------------------------------
      
       substr() took 2.0285921096802seconds 
       array access took 1.7474739551544seconds
      

      【讨论】:

      • 这应该是对戈登回答的评论。
      • 可以确认这一点。您的字符串越长,性能差异就越大。在我的 10 个字符的测试中,substr 慢了大约 20%
      • 并不奇怪,因为 substr() 具有函数调用的开销,而另一个是“C 类”直接字符串操作。顺便说一句,我在 PHP 7.1-dev 上运行了这段代码,结果为: substr() 耗时 7.090255022049 秒 \ 数组访问耗时 2.3145787715912 秒
      【解决方案8】:

      请记住,如果您有一个使用 fgets() 函数从文本文件中读取为一行的字符串,则需要使用 substr($string, -3, 1) 以便获得实际字符而不是 CRLF 的一部分(回车换行)。

      我认为提出问题的人不需要这个,但对我来说,我在从文本文件的字符串中获取最后一个字符时遇到了麻烦,所以我相信其他人也会遇到类似的问题。

      【讨论】:

        【解决方案9】:

        您可以通过多种方式使用 php 查找最后一个字符,例如 substr()mb_substr()

        如果您使用 UTF-8 等多字节字符编码,请使用 mb_substr 而不是 substr

        这里我可以给你看两个例子:

        <?php
            echo substr("testers", -1);
            echo mb_substr("testers", -1);
        ?>
        

        LIVE DEMO

        【讨论】:

          【解决方案10】:

          不同语言(包括 C sharp 和 PHP)的字符串也被视为字符数组。

          知道理论上数组操作应该比字符串操作更快,

          $foo = "bar";
          
          
          $lastChar = strlen($foo) -1;
          echo $foo[$lastChar];
          
          $firstChar = 0;
          echo $foo[$firstChar];
          

          然而,像

          这样的标准数组函数
          count();
          

          对字符串不起作用。

          【讨论】:

            【解决方案11】:

            使用带有负数的 substr() 作为第二个参数。$newstring = substr($string1, -1);

            【讨论】:

            • 为什么十多年后提供与answer相同的解决方案?
            【解决方案12】:

            Siemano,只获取所选目录中的 php 文件:

            $dir    = '/home/zetdoa/ftp/domeny/MY_DOMAIN/projekty/project';
            $files = scandir($dir, 1);
            
            
            foreach($files as $file){
              $n = substr($file, -3);
              if($n == 'php'){
                echo $file.'<br />';
              }
            }
            

            【讨论】:

              猜你喜欢
              • 2012-05-19
              • 2011-07-07
              • 2011-08-17
              • 2013-07-06
              • 1970-01-01
              • 2012-11-03
              • 2011-11-18
              相关资源
              最近更新 更多