PHP - замена нескольких наборов заполнителей во время циклического перемещения по массивам

0

Я работаю над частью кода, чтобы помочь мне создать тело электронной почты на основе ценностей, очищенных от веб-сайта. Но у меня возникают проблемы с заменой заполнителей ценностями.

Мой код "replace placeholder" выглядит следующим образом:

foreach ($products as $productID) 
{
    $product_array = scrape_product($scrape_url, $productID);

    foreach ($product_array as $key => $value)
    {
        $pattern = '/\#' . $key . '\#/';
        $email_body = preg_replace($pattern, $value, $email_body, $product_count);
    }
}

Функция scrape_product ($ scrape_url, $ productID); возвращает несколько массивов, которые выглядят следующим образом:

$product_array = array(
    "PRODUCTID" => $ID,
    "TITLE"     => $productname,
    "ONELINER"  => $oneliner,
    "PRICE"     => $price,
    "PRICE_ORG" => $price_org,
    "DISCOUNT"  => $discount,
    "IMAGE"     => $image,
    "URL"       => $scrape_url,
);

Массивы состоят или пары ключевых значений, и для каждого массива я возвращаюсь. Я прохожу через свой почтовый шаблон, ищущий местозаполнитель в формате # key # → например # PRODUCTID #.

Затем я использую это:

$pattern = '/\#' . $key . '\#/';
$email_body = preg_replace($pattern, $value, $email_body, $product_count);

Заменить заполнители соответствующим заполнителем.

Итак, вот моя проблема: в моем шаблоне электронной почты есть несколько вхождений одного и того же заполнителя (т.е. # PRODUCTID #) - точнее, имеется полный набор заполнителей для каждого массива.

Но я не могу заставить код правильно заменить заполнители... например:

array1 -> placeholder set1
array2 -> placeholder set2
array3 -> placeholder set3
and so on...

Моя система позволяет в общей сложности 12 продуктов = 12 массивов с информацией о продукте, которые необходимо поместить в шаблон электронной почты. Но сейчас он заменяет местозаполнитель значениями из массива 1 и затем заканчивается (потому что после первого прогона нет заполнителей).

Переменная $ product_count содержит количество массивов продуктов (может быть от 1 до 12)

Я уже пробовал использовать strtr() и str_replace() без всякой удачи.

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

UPDATE - добавлен пример моего шаблона

<table width="285" cellspacing="0" cellpadding="0" border="1" style="text-align: left; margin-left: 5px; table-layout: fixed;">
<tbody>
    <tr>
        <td align="center" width="284" valign="middle" colspan="2">
            <a href="#URL##PRODUCTID#/?ssel=false&utm_campaign=%%jobid%%-%%xtyear%%%%xtmonthnumeric%%%%xtday%%&utm_source=newsletter&utm_medium=email&utm_content=#PRODUCTID#" target="_blank">
                <img src="#IMAGE#" style="width: 200px; height: 150px; border: 0pt none; margin: 0px;" width="200" height="150" alt="#TITLE#"  />
            </a>
        </td>
    </tr>

    <tr>
    <td colspan="2" height="3" style="font-size:1px; line-height:1%;"> </td>
    </tr>
    <tr style="font-family: arial; font-size: 15px; color: #363636; font-weight: bold; margin-top: 0px; margin-bottom: 0px;">
        <td width="285" valign="top" colspan="2">
            #TITLE#
        </td>
    </tr>
    <tr style="font-family: arial; font-size: 15px; font-weight: 100; color: #363636;">
        <td height="85" align="left" valign="top" style="height: 85px; font-size: 11px; margin-top: 0px; margin-bottom: 0px;">
            <table cellspacing="0" cellpadding="0" align="left" valign="top" style="font-family: arial; text-align-left; font-size: 11px; margin-top: 0px; margin-bottom: 0px;">
                <tr>
                    <td height="3" style="height:3px; font-size:1px; line-height:1%;"> </td>
                </tr>
                <tr>
                    <td valign="top" height="54" style="height: 54px;">
                        #ONELINER#
                    </td>
                </tr>
            </table>
    </tr>
</tbody>
</table>
<table width="285" cellspacing="0" cellpadding="0" border="1" style="text-align: left; margin-left: 5px; table-layout: fixed;">
<tbody>
    <tr>
        <td align="center" width="284" valign="middle" colspan="2">
            <a href="#URL##PRODUCTID#/?ssel=false&utm_campaign=%%jobid%%-%%xtyear%%%%xtmonthnumeric%%%%xtday%%&utm_source=newsletter&utm_medium=email&utm_content=#PRODUCTID#" target="_blank">
                <img src="#IMAGE#" style="width: 200px; height: 150px; border: 0pt none; margin: 0px;" width="200" height="150" alt="#TITLE#"  />
            </a>
        </td>
    </tr>

    <tr>
    <td colspan="2" height="3" style="font-size:1px; line-height:1%;"> </td>
    </tr>
    <tr style="font-family: arial; font-size: 15px; color: #363636; font-weight: bold; margin-top: 0px; margin-bottom: 0px;">
        <td width="285" valign="top" colspan="2">
            #TITLE#
        </td>
    </tr>
    <tr style="font-family: arial; font-size: 15px; font-weight: 100; color: #363636;">
        <td height="85" align="left" valign="top" style="height: 85px; font-size: 11px; margin-top: 0px; margin-bottom: 0px;">
            <table cellspacing="0" cellpadding="0" align="left" valign="top" style="font-family: arial; text-align-left; font-size: 11px; margin-top: 0px; margin-bottom: 0px;">
                <tr>
                    <td height="3" style="height:3px; font-size:1px; line-height:1%;"> </td>
                </tr>
                <tr>
                    <td valign="top" height="54" style="height: 54px;">
                        #ONELINER#
                    </td>
                </tr>
            </table>
    </tr>
</tbody>

Как вы (надеюсь) можете видеть в коде шаблона, заполнители появляются более одного раза (например, # ONELINER #).

Я хочу заменить # # ONELINER # placeholder значением oneliner для продукта 1 в первый раз, когда я встречаю местозаполнитель. Во второй раз это должно быть значение для продукта 2 и так далее...

Надеюсь, это имеет смысл.

ОБНОВИТЬ

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

PRODUCTID -> 50107639XX
TITLE -> Sony XPERIA Z1 Compact 
ONELINER -> Det bedste fra Sony i en kompakt, vandtæt smartphone
PRICE -> 2500
PRICE_ORG -> 5000
DISCOUNT -> 50% 
IMAGE -> //media.jflindt.dk/image/49377/500/400/sony-xperia-z1-compact-16gb-sort.jpg
URL -> http://www.jflindt.dk/product/
Теги:
arrays
preg-replace
placeholder

1 ответ

1

На самом деле для такой простой замены вам не нужен preg. Вы можете использовать str_replace();

$search = array(
   '#PRODUCTID#',
   '#TYPE#',
   '#CAT#'
);

$replace = array(
   'val1',
   'val2',
   'val3'
);

$text = str_replace($search, $replace, $text);

Как заметил Амал, если у вас есть массив пар:

$pairs = array(
    "#PRODUCTID#" => $ID,
    "#TITLE#"     => $productname,
    "#ONELINER#"  => $oneliner
);

Вы можете использовать strtr();

$text = strtr($text, $pairs);

Altho Я лично предпочитаю str_replace из-за его имени. Если вам нужно построить $search и $replace массивы, имея один массив из $pairs, вы можете сделать:

$search = array_keys($pairs);
$replace = array_values($pairs);
  • 1
    str_replace() обычно твой друг.
  • 1
    Или strtr() , если уж на то пошло.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню