【问题标题】:Explode a string into an array with assigned value and send the email to multiple reciepient将字符串分解为具有指定值的数组并将电子邮件发送给多个收件人
【发布时间】:2018-01-22 22:23:05
【问题描述】:

我声明了一个字符串,如下所示

var email = 'xxx@email.com,ggg@gmail.com'

我用explode把它做成一个数组

$emails = explode(",", $user->email);

与 $emails 输出类似

array:2 [▼
  0 => "xxx@email.com"
  1 => "ggg@gmail.com"
]

我的期望是

$a = array('xxx@email.com'=>'abc','ggg@gmail.com'=>'cde');

Result:

array:2 [▼
  "xxx@email.com"=> "abc"
  "ggg@gmail.com"=> "cde"
]

我想用收件人的名字向多个收件人发送电子邮件。例如

abc(xxx@email.com);cde(ggg@gmail.com)

邮件->发送给单个收件人时效果很好

mail->to('xxx@email.com','abc');

谁能告诉我如何才能将电子邮件发送给多个收件人并附上姓名?

【问题讨论】:

标签: php arrays laravel email


【解决方案1】:

试试这个:
它将使用 preg_match_all 创建两个数组,一个包含名称,一个包含电子邮件。
然后我使用 array_combine 创建带有命名键的电子邮件数组。

$str = "johnny-boy doe(xxx@email.com);cde(ggg@gmail.com)";

Preg_match_all('/([-A-Za-z0-9 ]+)\((.*?)\)/', $str, $match);

$emails = array_combine($match[2], $match[1]);

Var_dump($emails);

输出:

array(2) {
  ["xxx@email.com"] => string(14) "johnny-boy doe"
  ["ggg@gmail.com"] => string(3) "cde"
}

https://3v4l.org/shqAe

编辑; emails 数组中的键和值顺序错误。 编辑2;我只记得如果名字是名字和姓氏,我以前的代码将不起作用。将 \w+ 替换为更广泛的名称匹配。

【讨论】:

    【解决方案2】:

    您是否尝试过使用 foreach ?例如:

    foreach($a as $key=>$val) {
       mail->to($key, $val);
    }
    

    更新

    如果你的字符串如你所说,也许你可以这样做:

    $string = "abc(xxx@email.com);cde(ggg@gmail.com)";
    $data = explode(';', $string);
    $detailsArray = array();
    
    foreach($data as $datax){
        $email = "";
        //Using regex to filter out string with paranthesis
        preg_match('#\((.*?)\)#', $datax, $email);
    
        //using str_replace to remove the email together with paranthesis to get the name
        $name = str_replace($email[0], "", $datax);
    
        //removing paranthesis
        $email[0] = str_replace(array('(',')'),'',$email[0]);
    
        //push it into array
        $array = array($email[0] => $name);
        array_push($detailsArray,$array );
    }
    

    【讨论】:

    • 上面提到了问题。如何将我的字符串转换为特定的键和值?如果我使用explode()?
    • 哦,很抱歉造成误会,请参考最新更新,希望对您有所帮助!
    • 对不起,伙计,但这是一种非常低效的方法。我不明白 $email 的用法。首先,您将其创建为字符串,然后 preg_match 使其成为数组。您使用模式删除 (),但您不使用该项目。您使用完全匹配的 [0] 并从中删除 () 。如果它有两个以上的地址,那么在每个项目上循环和执行 preg_match 也会很痛苦。使用 10 封电子邮件,加载您的代码需要 0.5 秒。
    • 我已经发布了一个答案,它可能不是最好的方法,但它更快。为了使您的代码更好,您可以完全删除 removing paranthesis 部分,因为 $email[1] 与 str_replace 的结果相同。但即使有了这种变化,也没有太大区别。您仍在循环并多次执行相同的代码。
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 2016-08-21
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2013-09-02
    • 2015-05-21
    相关资源
    最近更新 更多