PHP - как обрезать строку, образованную циклом foreach? - PullRequest
1 голос
/ 23 мая 2011

Скажем, у меня есть следующий цикл в моем представлении

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;
}

Ответы [ 4 ]

3 голосов
/ 23 мая 2011

Почему бы не сохранить значения строк в переменной, обрезать эту переменную и просто повторить ее?

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

echo truncate_text($str, 'whatever');
2 голосов
/ 23 мая 2011

Прежде всего, 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;

Это также имеет преимущество, заключающееся в том, что вы не оставляете запятую в конце.

0 голосов
/ 23 мая 2011

Вы можете сделать это с помощью 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, ', ');

Преимущество этого (незначительного) заключается в том, что вам не нужно перебирать всю строку.

0 голосов
/ 23 мая 2011
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 будет выводить усеченный текст.

также рассмотрите возможность использования скобок для циклов или условий, хотя это необязательно, но это поможет вам во время отладки кода, так как использование скобок {} может правильно сделать отступ в вашем коде.

...