Михаил Юдин

Рендер текстовых шаблонов по данным из массива PHP

Рендер текстовых шаблонов по данным из массива PHP

Работая с текстовыми шаблонами для SEO например, встаёт задача использовать шаблоны строк, данные которых должны браться из массива.

Задача

Задача проста — воспользоваться шаблонами строк для отображения данных из массива. Сделать это можно несколькими способами:

  • сгенерировать текста в самом PHP
  • воспользоваться готовыми шаблонизаторами например Twig, Blade, Smarty, …
  • написать небольшую функцию для преобразования определённой подстроки в текст по данным из ассоциативного массива

Решение

Я предпочёл последний вариант, несмотря на подключенный Twig в проекте.

Первый вариант решения задачи выглядит следующим образом:

<?php

/**
 * PHP function to render string path template using nested array.
 * Renders template string like "Nested array item value: {data.some.nested.item.value}"
 * @param string $template
 * @param array $data
 * @return string
 */
public static function renderDataTemplate(string $template, array $data): string
{
  return preg_replace_callback('/{([^{}]+?)}/', static function ($v) use ($data) {
    $temp = &$data;
    foreach (explode('.', $v[1]) as $key) {
      $temp = &$temp[$key] ?? null;
      if ($temp === null) {
        return null;
      }
    }
    return $temp;
  }, $template);
}

Данная версия позволяет выполнять множественную замену вложенных шаблонов, применяя функцию несколько раз для шаблона вида:

{variables.{data.item.type}.{id}.name}

так как разворачивает только ближайшие фигурные скобки.

Актуальная версия функции PHP для рендера шаблона по данным из ассоциативного массива: PHP function to render string path template using nested array.

Ещё почитать

Нет фото

Parsee - простой вкусный парсер сайтов

Чеклист оптимизации скорости загрузки веб-приложения ✓

Чеклист оптимизации скорости загрузки веб-приложения ✓

Переход с PHPStorm или Intellij IDEA на VIM

Переход с PHPStorm или Intellij IDEA на VIM

Подсветка активных ссылок на чистом JavaScript

Подсветка активных ссылок на чистом JavaScript

Битва титанов: normalize.css против reset.css

Битва титанов: normalize.css против reset.css

CSS ищет баги в SEO: картинки без alt и внешние ссылки

CSS ищет баги в SEO: картинки без alt и внешние ссылки