【问题标题】:How to stop str_replace from changing all instances in every item in the array?如何阻止 str_replace 更改数组中每个项目中的所有实例?
【发布时间】:2016-03-22 07:38:27
【问题描述】:

我正在使用 for 循环循环一个多维数组,并为循环中的每个项目触发和发送电子邮件。我想将 {{fname}} 从密钥中更改为真实姓名。

foreach($customermarketingarray as $key => $value){
     $customeremail = $value['email'];
     $fname = $value['first_name'];
     $body = str_replace("{{fname}}",$fname,$body);                     
                             }

由于某种原因,除了 {{fname}} 在第一个循环中为循环中的每个 fname 使用第一个名称外,所有内容都是唯一的。如果第一个人是乔,那么每个人都姓乔

【问题讨论】:

  • 那你的数据有问题。

标签: php regex str-replace


【解决方案1】:

因为您一遍又一遍地使用一个$body,并且一旦替换完成,就没有什么可以替换的了。每次迭代都使用新版本的$body

foreach($customermarketingarray as $key => $value){
     $customeremail = $value['email'];
     $fname = $value['first_name'];
     $tempBody = str_replace("{{fname}}",$fname,$body);              
      // now use this $tempBody for display
     }

这样,在循环的每次迭代中,您都会再次从$body 获得一个新模板,您可以对其进行替换然后使用它。

【讨论】:

    【解决方案2】:

    第一次使用 str_replace 时,它​​会替换整个正文中出现的 {{fname}}。在进一步的循环迭代中没有什么可以替换的。

    使用 preg_replace ,它具有附加参数(限制),该参数说明最多将进行多少次替换。在您的示例中,如果每个名称只有一个 {{fname}} 使用 1 作为计数参数就可以了。

    阅读文档。这很不言自明。 http://php.net/manual/en/function.preg-replace.php

    另一件事是数据的构建问题。如果没有额外的规则,你无法区分哪个 {{fname}} 去哪个替换。

    尚不清楚您是否要使用 $body 作为模板(我假设为否,因为除了循环迭代中的替换之外,您没有使用 $body 进行任何操作)。如果正文中多次出现 {{fname}} 并且您想用循环迭代中的名称一一替换它们,我的回答是有效的。

    【讨论】:

    • 天啊...用 preg_replace 参数弄错了 - 立即更正我的答案:)
    【解决方案3】:

    您正在替换每个循环中的变量 $body。只需使用一个新变量来存储结果。请参阅下面的示例。

    <?php
    $customermarketingarray=array(
        0=>array("email"=>"1@test.com","first_name"=>"Joe1"),
        1=>array("email"=>"2@test.com","first_name"=>"Joe2"),
        2=>array("email"=>"3@test.com","first_name"=>"Joe3"),
        3=>array("email"=>"4@test.com","first_name"=>"Joe4")
    );
    $body="First Name: {{fname}}<br>Email: {{email}}<br><br>";
    foreach($customermarketingarray as $key => $value){
         $customeremail = $value['email'];
         $fname = $value['first_name'];
         $email = $value['email'];
         $res_body .= str_replace(array("{{fname}}","{{email}}"),array($fname,$email),$body);
    }
    echo $res_body;
    ?>
    

    以上代码的结果是

    First Name: Joe1
    Email: 1@test.com
    
    First Name: Joe2
    Email: 2@test.com
    
    First Name: Joe3
    Email: 3@test.com
    
    First Name: Joe4
    Email: 4@test.com
    

    【讨论】:

      【解决方案4】:

      使用 preg_replace

      可以使用 preg_replace 代替 str_replace 答:PHP variables and loops in HTML format

      检查已弃用,http://php.net/manual/en/function.preg-replace.php

          $body_message = $body;
          foreach($customermarketingarray as $key => $value){
               $customeremail = $value['email'];
               $fname = $value['first_name'];
              // $body = str_replace("{{fname}}",$fname,$body);  
              $body_message  = preg_replace("/{{(.*?)}}/e","@$$1", $body);                   
          }
      

      使用 str_replace

      $body_message = $body;
      foreach($customermarketingarray as $key => $value){
           $customeremail = $value['email'];
           $fname = $value['first_name'];
           $body_message = str_replace("{{fname}}",$fname,$body);                        
           }
      

      【讨论】:

        猜你喜欢
        • 2016-06-23
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多