Цикл Foreach возвращает только первый индекс в многомерном массиве PHP - PullRequest
5 голосов
/ 11 октября 2019

Позвольте мне объяснить мою ситуацию, я делаю шаблон рассылки для моей компании. Этот почтовый шаблон должен быть полностью в HTML. Шаблон рассылки содержит различные товары из нашего магазина. В шаблоне есть коробки с информацией о товарах. позвольте мне показать вам мой шаблон:

mailing-template.html

         <div>
                    ##PRODUCT_NAME##                     <br />    
                    Onderdeel Nr: ##PRODUCT_ID##         <br />  
                    Merk: ##PRODUCT_BRAND##              <br />  
                    Prijs: €##PRODUCT_PRICE##            <br />
         </div>

Как вы, вероятно, можете сказать, ## PRODUCT_INFORMATION # - это места, где будет находиться информация о моем продукте. приходить. С помощью PHP я могу заменить это. Я получаю информацию о моем продукте из различных массивов, которые выглядят следующим образом:

массивы

$products = array
(
    array
    (
        'product_id' => 'RD55559955',
        'product_name' => 'Ontsteking (DI) Cassette Zwart Origineel Saab 9-3/9-5',
        'price_excl' => 22600,
        'product_brand' => 'Origineel Saab',
    ),

    array
    (
        'product_id' => 'RD55559955',
        'product_name' => 'een ander product',
        'price_excl' => 22600,
        'product_brand' => 'Origineel Saab',
    ),

    array
    (
        'product_id' => 'RD55559955',
        'product_name' => 'nog een ander product',
        'price_excl' => 22600,
        'product_brand' => 'Origineel Saab',
    )
);

Теперь позвольте мне показать вам, как заменить информацию:

createTemplate.php

//get content from mailing-template
$template = file_get_contents(dirname(__FILE__).'/mailing-template.html');
$content = $template;

foreach ($products as $product){

//replace placeholders with actual product data
$content = str_ireplace('##PRODUCT_ID##', $product['product_id'], $content);
$content = str_ireplace('##PRODUCT_NAME##', $product['product_name'], $content);
$content = str_ireplace('##PRODUCT_PRICE##', round($product['price_excl']/100, 2), $content);
$content = str_ireplace('##PRODUCT_BRAND##', $product['product_brand'], $content);


//echo the template
echo $content;
}

Я использую str_ireplace для замены информации.

То, что я хочу: Итак, я хочу, чтобы отображалось поле информации о продукте для каждого массива.

Проблема: То, что он делает, отображает триящики с продуктами только из первого массива.

Вопрос: Кто-нибудь знает, как я могу отобразить три ящика из всех трех разных массивов?

Этот вопрос довольно велик для того, какпростой ответ, вероятно, таков, но я застрял довольно давно, поэтому я надеялся, что кто-то здесь сможет мне помочь. Спасибо, что нашли время, цените всю помощь, которую я могу получить!

Я действительно новичок во всем этом, включая stackoverflow, так что поправьте меня, если сможете. :)

Примечание. Когда i echo $product['product_name'] за пределами $content, отображается три разных имени. Это не работает всякий раз, когда я редактирую $content. Я просто не понимаю, почему.

Ответы [ 2 ]

4 голосов
/ 11 октября 2019

Вы уничтожаете свой шаблон с помощью первого цикла

, перемещая $content = $template; в цикл foreach, чтобы он каждый раз получал «свежий» источник шаблона.

foreach ($products as $product){
  $content = $template;
2 голосов
/ 11 октября 2019

После первого цикла не осталось заполнителей.

Вам необходим новый шаблон на каждой итерации.

Я также не вижу необходимости в заменах с учетом регистра.

Первые два параметра str_replace() будут принимать массивы, поэтому вы можете уменьшить общее количество вызовов функций до одного.

Протестированный код: ( Demo )

foreach ($products as $product) {
    echo str_replace(
             ['##PRODUCT_ID##', 
              '##PRODUCT_NAME##',
              '##PRODUCT_PRICE##',
              '##PRODUCT_BRAND##'],
             [$product['product_id'],
              $product['product_name'],
              round($product['price_excl']/100, 2),
              $product['product_brand']],
             $content
         );
}

Вывод:

<div>
     Ontsteking (DI) Cassette Zwart Origineel Saab 9-3/9-5                     <br />    
     Onderdeel Nr: RD55559955         <br />  
     Merk: Origineel Saab              <br />  
     Prijs: €226            <br />
</div><div>
     een ander product                     <br />    
     Onderdeel Nr: RD55559955         <br />  
     Merk: Origineel Saab              <br />  
     Prijs: €226            <br />
</div><div>
     nog een ander product                     <br />    
     Onderdeel Nr: RD55559955         <br />  
     Merk: Origineel Saab              <br />  
     Prijs: €226            <br />
</div>
...