<rmcreative>

RSS

Удалить последнюю запятую

17 июля 2008

Типичная задача.

Сформировали список тэгов, расставляя после каждого «,». После последнего тоже запятая… надо убрать.

Наверное многие это уже знают, но всё же:

$str = 'tag1, tag2, tag3,';
echo substr($str, 0, -1);

Кстати, это можно решить ещё во время формирования строки.

Комментарии RSS

  1. №447
    Psih
    Psih 17 июля 2008 г., 17:56:02

    Можно ещё проще

    $str = 'tag1, tag2, ..., tagN,';

    $str = trim($str, ',');

    Как решить во время форматирования я тоже отписал свой вариант в той записи.

  2. №448
    Ktulhu
    Ktulhu 17 июля 2008 г., 17:56:08

    Позволю с вами совсем не согласиться. Для этого есть chop() (который алиас rtrim())

    Вызывается легко и непринужденно chop($str, ',');

    А еще лучше chop($str, ' ,');

    Объясню почему - в конце строки у вас может получиться так, что будет мусор, типа " , ".

    Тогда вам придется делать echo substr(trim($str), 0, -1); - что есть ненужная нагрузка, когда есть chop, которому мы в конце скармливаем список символов для рубки :)

  3. №451
    Sam
    Sam 17 июля 2008 г., 18:29:53

    Ktulhu

    trim тоже принимает список символов, но chop конечно более подходящая штука для данного случая.

  4. №452
    Евгений
    Евгений 17 июля 2008 г., 19:03:56

    А зачем формировать список тегов именно так, не удобней ли:

    $tags = array('tag1', 'tag2', 'tag3');

    echo implode(', ', $tags);

  5. №453
    Sam
    Sam 17 июля 2008 г., 19:09:02

    Чаще всего удобней, но иногда не выходит. Например, если массив многомерный… это не обязательно тэги.

    $links = array(
     0 => array(
       'name' => 'link1',
       'link' => 'http://name1.com/'), 
     1 => array(
       'name' => 'link2',
       'link' => 'http://name2.com/'), 
    );
  6. №455
    Splurov
    Splurov 17 июля 2008 г., 21:30:47

    Sam, тогда так может проще? :-)

    $result = array();
    foreach ( $links as $v ) {
      $result[] = '<a href="' . $v[ 'link' ] . '">' . $v[ 'name' ] . '</a>';
    }
    $result = implode( ', ', $result );
  7. №456
    Sam
    Sam 17 июля 2008 г., 21:40:11

    Splurov

    Так немного медленней, чем с формированием строки и chop().

    Проявляется при обработке массива от 1000 элементов.

  8. №457
    Splurov
    Splurov 17 июля 2008 г., 22:05:52

    Sam, к счастью, нам не приходиться выводить пользователю списки из тысячи и более составляющих

  9. №458
    Евгений
    Евгений 18 июля 2008 г., 2:03:08

    Ну я то именно такой массив для тегов и представлял, но не хотел менять исходные данные.

    Потестил тут немного для массива вида:

    $links = array(
     0 => array(
       'name' => 'link1',
       'link' => 'http://name1.com/'),
     1 => array(
       'name' => 'link2',
       'link' => 'http://name2.com/'),
    );~~~
     
    три варианта:
    1)
    [code=php]function html_link($v) { return '<a href="' . $v[ 'link' ] . '">' . $v[ 'name' ] . '</a>'; }
    $result = implode(', ', array_map('html_link', $links));

    2) как предложил Splurov [code=php]$result = array(); foreach ( $links as $v ) { $result[] = '' . $v[ 'name' ] . ''; } $result = implode( ', ', $result );

    
    
    
    3) без массивов с chop
    
    

    [php]

    $result = ''; foreach ( $links as $v ) { $result .= '' . $v[ 'name' ] . ', '; } $result = chop($result, ' ,'); ~~~

    Для массива $links из 10 элементов (как наиболее типичный для тегов) и 100000 повторений получилось (в секундах все):

    1) 7.84984397888

    2) 2.80158305168

    3) 2.40084600449, просто сборка без chop 1.68192100525

  10. №459
    Евгений
    Евгений 18 июля 2008 г., 2:07:38

    Не очень удачно запостился коммент, предварительный просмотр не повредил бы.

    1)

    function html_link($v) { return '<a href="' . $v[ 'link' ] . '">' . $v[ 'name' ] . '</a>'; }
     
    $result = implode(', ', array_map('html_link', $links));

    2)

    $result = array();
        foreach ( $links as $v ) {
          $result[] = '<a href="' . $v[ 'link' ] . '">' . $v[ 'name' ] . '</a>';
        }
        $result = implode( ', ', $result );
  11. №467
    Витёк
    Витёк 22 июля 2008 г., 1:29:12

    Вариант с chop() понравился, это звучит, как фраза «отрезать запятую в конце».

  12. №1933
    Безумный Макс
    Безумный Макс 20 окт. 2009 г., 9:24:02

    Спасибо за 4 варианта (trim, chop, substr и implode)! То что нужно!!!

  13. №8013
    Ярослав
    Ярослав 27 мая 2013 г., 22:28:59

    Если интересует решение на яваскрипте:

    Данные (Не важно, массив или просто набор слов через запятую) помещаем в переменную и обрезаем её на 1 символ с конца:

    var apo = 'День, Ночь, Утро, Вечер,';
    var apo2 = apo.substr(0, apo.length-2);
  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.