Преобразовать строку, разделенную запятыми, в массив

#php #arrays #string

#php #массивы #строка

Вопрос:

У меня есть строка, разделенная запятыми, которая состоит из списка тегов, и я хочу преобразовать ее в массив, чтобы получить ссылку для каждого тега.

Пример:

 $string = 'html,css,php,mysql,javascript';
  

Я хочу сделать это следующим образом:

 <a href="tag/html">html</a>, <a href="tag/css">css</a>, <a href="tag/php">php</a>, <a href="tag/mysql">mysql</a>, <a href="tag/javascript">javascript</a>
  

Таким образом, результатом будет строка, содержащая ссылки, разделенные запятыми, с пробелом после каждой ссылки и без запятой после последней ссылки.

У меня есть эта функция, где $ arg = ‘html, css, php, mysql, javascript’:

 function info_get_tags( $arg ) {
    global $u;

    $tagss = '';
    if ( $arg == '' ) {
        return '';
    } else {
        $tags_arr = explode( ',' , $arg );
        foreach ( $tags_arr as $tag ) {
            $tags = '<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag . '</a>';
            $tagss .= $tags;
        }

        return $tagss;
    }
}
  

У меня этот скрипт работает, но без запятых и пробелов, и если мы добавим сюда запятую и пробел:

 $tags = '<a href="' . $u . 'tag/' . $tag . '/">' . $tag . '</a>, ';
  

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

Ответ №1:

Точно так же, как вы explode делали, вы можете implode снова:

 $tags = explode(',', $arg);
foreach ($tags as amp;$tag) {
    $tag = '<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag . '</a>';
}

return implode(', ', $tags);
  

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

1. у меня это хорошо работает, но не могли бы вы сказать мне, для чего нужен тег amp; before $?

2. @med: amp; Означает, что вы выполняете итерацию по ссылке. Таким образом, вы можете изменять, $tag и элемент в $tags массиве тоже будет изменен.

3. Это оператор для передачи по ссылке, что означает, что он напрямую изменяет исходное значение, а не его копию.

4.Вы должны всегда unset ссылаться только на тот var, который у вас есть, внутри foreach : foreach ( $a as amp;$b ) { ... unset($b); } Это где-то на PHP.net и это очень хорошая практика.

Ответ №2:

Вот альтернатива, которая использует array_map вместо цикла foreach:

 global $u; 
function add_html($tag){
    return('<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag .  '</a>');
}
function get_tags($taglist){
    $tags_arr = array_map("add_html", explode( ',' , $taglist));
    return implode(", " , $tags_arr);
} 
  

Ответ №3:

Попробуйте этот короткий код

$string = ‘html,css,php, mysql, javascript’;

$string = explode(‘,’, $string);
foreach( $string как $link){
echo '<a href="tag/'.$link.'">'.$link.'</a>';
}

Ответ №4:

Самый простой способ — преобразовать html в массив (каждая ссылка тега является элементом массива), а затем преобразовать в ,

 if ( $arg == '' ) {

    return '';

} else {

    $tags_arr = explode( ',' , $arg );
    $tags  = array();
    $tagtpl = '<a href="%s" title="%s">%s</a>';

    foreach ( $tags_arr as $tag ) {
        $url = $u . 'tag/' . $tag . '/';
        $tags[] = sprintf($tagtpl, $url, $tag, $tag);

    }

    return implode(', ', $tags);

}
  

Ответ №5:

Попробуйте это

 $tagss = trim($tagss);    
return substr($tagss, 0 , strlen($tagss)-1);
  

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

1. Вы можете просто написать substr($tagss, 0, -2) 😉

2. @nikic да, ты прав, быстрее и приятнее, но rtrim еще лучше

Ответ №6:

Почему бы не поместить все теги в массив при их создании, а позже разбить массив и добавить запятые и пробелы между тегами.

 foreach ( $tags_arr as $tag ) {
    $tags = '<a href="' . $u . 'tag/' . $tag . '/" title="' . $tag . '">' . $tag . '</a>';
    $tagss[] = $tags;
}
$tagss = explode(', ', $tagss);
  

Ответ №7:

Обходным путем(!) было бы впоследствии удалить ненужные завершающие символы:

 $tagss = rtrim($tagss, ", ");
  

Это rtrim удаляет любое сочетание пробелов и запятых с правого конца строки.

Кстати, вы могли бы использовать str_getcsv вместо explode, который также лучше обрабатывает входные пробелы.

Ответ №8:

 function info_get_tags($arg)
{
    global $u;
    if (empty($arg)) return '';
    return ltrim(preg_replace('/([^,] )/', ' <a href="' . $u . '/${1}/" title="${1}">${1}</a>', $arg));
}
  

Ответ №9:

 $string = 'html,css,php,mysql,javascript';

puts $string.split(/,/).map { |tag| "<a href="tag/#{tag}">#{tag}</a>"}.join(", ")
  

Результат:

 <a href="tag/html">html</a>, <a href="tag/css">css</a>, <a href="tag/php">php</a>, <a href="tag/mysql">mysql</a>, <a href="tag/javascript">javascript</a>
  

Ответ №10:

Другое решение:

 $html = trim(preg_replace('/([^,] )/', ' <a href="/tags/1" title="1">1</a>', $string));
  

Или, если вам нужно кодировать теги в html (всегда разумно, поскольку вы создаете html из текста):

 $html = trim(preg_replace_callback('/([^,] )/', function($match) {
    $tag = $match[1];
    return ' <a href="/tags/' . urlencode($tag) . '" title="' . htmlspecialchars($tag) . '">' . htmlspecialchars($tag) . '</a>';
}, $string));
  

Так что это $string тоже сработало бы: "tag with space,html,css,php,mysql,javascript"

Больше регулярных выражений — это всегда хорошо!