【问题标题】:PHP - how to truncate a string formed by a foreach loop?PHP - 如何截断由 foreach 循环形成的字符串?
【发布时间】:2011-05-23 02:45:28
【问题描述】:

假设我认为我有以下循环

foreach ($value as $row):
     echo $row['name'] . ', ';
endforeach;

这会在我的浏览器中输出这样的字符串

格迪、李、尼尔、皮尔特、亚历克斯,

我想知道是否有人可以建议一种方法来截断此字符串 n 字符,例如

格迪、李、内...

由于字符串是从循环中输出的,我不确定如何围绕这个foreach 包装一个截断函数。

感谢您的帮助!

截断函数示例

function truncate_text($text, $nbrChar, $append='...') {
     if(strlen($text) > $nbrChar) {
          $text = substr($text, 0, $nbrChar);
          $text .= $append;
     }
     return $text;
}

【问题讨论】:

    标签: php foreach truncate strlen


    【解决方案1】:

    为什么不将行值保存到变量中并截断该变量并回显它?

    var $str = "";
    foreach ($value as $row):
         $str .= $row['name'] . ', ';
    endforeach;
    
    echo truncate_text($str, 'whatever');
    

    【讨论】:

      【解决方案2】:

      首先,foreach 不是必需的。其次,如果需要,我们可以非常简单地截断它。

      // Maximum length of the string; note that this does not include the '...'
      $length = 20; 
      
      // This is PHP 5.3 only and converts the value array to an array of names 
      // $value = array_map(function ($f) { return $f["name"];}, $value);
      
      // This is a PHP 5.2 way to do the array mapping
      $value = array_map(create_function('$f', 'return $f["name"];'), $value);
      
      $string = join(', ', $value);
      $truncated = (strlen($string) > $length) 
          ? substr($string, 0, $length) . '...' 
          : $string;
      

      这还有一个好处是不会留下难看的尾随逗号。

      【讨论】:

      • 你肯定需要一种方法来遍历数组,因为它看起来是一个具有多个键的关联数组。
      • 您还可以使用 substr($string, 0, $length) 中的 $length 变量来使其更具动态性。 +1 在循环循环中使用三元 n 而不是 ifs
      • @el yobo,我展示的foreach 实际上嵌套在其他几个foreach's 中,所以最后@fourth 的解决方案效果最好-感谢您的评论
      • @Tapos,公平点。我添加了一个 array_map 调用来提取名称。 @Lawrence,是的,这实际上就是我把它放在那里的原因,但忘了把它放在另一位......谢谢:)
      • @el yobo - 是否有使用您的解决方案的 PHP 5.2 方式?我的服务器是 5.2.14
      【解决方案3】:
      function truncate_text($text, $nbrChar, $append='...') {
           if(strlen($text) > $nbrChar) {
                $text = substr($text, 0, $nbrChar);
                $text .= $append;
           }
           return $text;
      }
      

      然后在foreach中你可以这样做

      foreach ($value as $row) {
           $name = truncate_text($row['name']);
      }
      

      现在$name 将输出截断的文本。

      还可以考虑为循环或条件使用括号,虽然这不是必需的,但它会在调试代码时对您有很大帮助,因为使用括号 {} 可以正确缩进您的代码。

      【讨论】:

        【解决方案4】:

        您可以通过break 做到这一点

        $limit = 20;
        $str = '';
        foreach ($value as $row) {
           if ($str > $limit) {
              $str .= substr($row, 0, $limit) . '...';
              break;
           }
           $str .= "$row, ";
           $limit -= strlen($row);
        }
        $str = rtrim($str, ', ');
        

        这样做的(次要)优点是您不必遍历整行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-22
          • 2012-01-19
          • 1970-01-01
          • 1970-01-01
          • 2016-12-22
          • 2015-08-29
          • 2013-09-29
          • 1970-01-01
          相关资源
          最近更新 更多