PHP добавление foreach в мой массив

#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);
...