#php #arrays #foreach #dry #explode
#php #массивы #foreach #сухой #взорваться
Вопрос:
Я хотел бы добавить html к элементу в моем массиве, прежде чем повторять его на своей странице, и я не уверен, как это сделать.
Мои данные помещаются в массив следующим образом:
$query = $this->db->get();
foreach ($query->result() as $row) {
$data = array(
'seo_title' => $row->seo_title,
'seo_description' => $row->seo_description,
'seo_keywords' => $row->seo_keywords,
'category' => $row->category,
'title' => $row->title,
'intro' => $row->intro,
'content' => $row->content,
'tags' => $row->tags
);
}
return $data;
Я хотел бы выполнить следующее с моими «тегами», прежде чем возвращать данные в мое представление:
$all_tags = explode( ',' , $row->tags );
foreach ( $all_tags as $one_tag ){
echo '<a href="/search/'. $one_tag .'">' . $one_tag . '</a>';
Причина этого заключается в том, что теги в моей базе данных не содержат html и просто разделяются запятыми вот так news,latest,sports
, и я хочу преобразовать их в
<a href="/search/sports">sports</a> ...
Моя причина делать это здесь, а не когда я повторяю данные, заключается в том, что я не хочу повторяться на каждой странице.
Ответ №1:
Вы могли бы просто создать функцию, которая будет использоваться везде, где вы находитесь, включая теги в свой вывод:
function formatTags($tags) {
$tmp = explode(',', $tags);
$result = "";
foreach ($tmp as $t) {
$result .= sprintf('<a href="/search/%s">%s</a>',
urlencode(trim($t)), htmlentities(trim($t)));
}
return $result;
}
И всякий раз, когда вы делаете что-то подобное, echo $tags;
вы делаете echo formatTags($tags);
вместо этого. Код представления должен быть отделен от кода модели, поэтому я бы посоветовал не помещать HTML в ваш массив.
Ответ №2:
Ну, во-первых, вы перезаписываете $data
при каждом запуске цикла, поэтому в списке будет указана только строка конечного результата.
Как только это устранено (исправлено с помощью $data[] = ...
), попробуйте это:
...
'tags' => preg_replace( "/(?:^|,)([^,] )/", "<a href="/search/$1">$1</a>", $row->tags);
...