如何使用'动态'来自其他地方的多维数组的变量?

时间:2016-08-29 15:44:14

标签: php mysql arrays email multidimensional-array

我有一个mysql'客户端电子邮件'包含客户端ID和分配给这些客户端ID的电子邮件地址的表,每个客户端可以有多个已分配的电子邮件;并且客户端电子邮件表不断更新并添加到,因此我没有设置client_ids列表。

'client-emails'
client_id | email
============
27 | email1@client27domain
27 | email2@client27domain
42 | email1@client42domain
42 | email2@client42domain
42 | email3@client42domain
46 | email1@client46domain

我有一个电子邮件PHP脚本,每天晚上使用cron作业向这些客户发送一封电子邮件。这很好,但现在我们需要按照client_id对这些电子邮件进行个性化设置,因此我需要为每个客户端分割每个客户端的电子邮件组,并且当电子邮件发送时,它知道哪组逗号分隔的电子邮件到在" To"每个client_id的字段,以及提取客户端ID的电子邮件正文中的变量。

To: $clientEmails
and within the message there'll be a "Your ID is: $clientId".

i.e.,
To: email1@client27domain,email2@client27domain
And in the message will be:
Your ID is: 27

不确定这是否正确,但我在以下查询中一直在玩GROUP_CONCAT:

$sql = "SELECT client_id, GROUP_CONCAT(email) AS emails FROM portal_client_report_emails GROUP BY client_id ORDER BY client_id ASC";

并且正在做:

$grouped = array();
foreach ($rows as $item) {
 $grouped[$item['client_id']][] = $item;
}

转出:

array (
 27 =>
 array (
   0 =>
   array (
     'client_id' => '27',
     'emails' => 'email1@client27domain,email2@client27domain',
   ),
 ),
 42 =>
 array (
   0 =>
   array (
     'client_id' => '42',
     'emails' => 'email1@client42domain,email2@client42domain,email3@client42domain',
   ),
 ),
 46 =>
 array (
   0 =>
   array (
     'client_id' => '46',
     'emails' => 'email1@client46domain',
   ),
 ),
)

我是否能够循环遍历该数组,以告诉我的$ to mail()中的变量,以便为每个内容电子邮件发送每个client_id的单独电子邮件?

对于我的邮件测试,我目前只使用基本的mail()函数:

$to = (needs to emails per respective client ID);
$subject = "Client Details";
$message = "Your Client ID: " .  $clientID;
mail($to,$subject,$msg);

我可以请求$ to变量帮助我做我需要的吗?谢谢!

更新:以下内容仅为每个client_id抓取第一个电子邮件地址。

"SELECT client_id,email...";
$data = array();
while($row = mysqli_fetch_array($rows)){
    $data[$row['client_id']][] = $row['email'];
}

1 个答案:

答案 0 :(得分:2)

不要使用group_concat。这需要多个记录并将其折叠为SINGLE值。它对结果字符串也有一个长度限制,并且会静默截断超出限制的任何内容,从而使您丢失数据并可能损坏“最终”数据。

只需使用常规查询:

SELECT id, email ...

然后使用循环:

$data = array();
while($row = ... fetch ...) {
    $data[$row['id']][] = $row['email'];
}

这将为您提供一个漂亮的2D数组的ID和电子邮件地址,无需UNDO任何连接或其他 - 您只需按原样开始使用地址,无需进一步处理:

foreach($data as $id => $addresses) {
    foreach($addresses as $addr) {
          send("Hi, $addr, your id is $id");
    }
}