#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"
Больше регулярных выражений — это всегда хорошо!