php数组 - 为每个唯一的电子邮件地址发送一封电子邮件,将数据分组在一起

时间:2011-11-10 15:39:14

标签: php mysql arrays email

我在数组中有无限数量的项目:

$query = mysql_query("SELECT * FROM orders WHERE orderID = '$orderID'");        

while($row = mysql_fetch_array($query)){
   $items[] = $row[itemnumber];
   $quantity[] = $row[quantity];
   $vendoremail[] = $row[vendoremail];
} 

数组中的值可能是这样的:

 $items = ("A","B", "C");
    $quantity = ("2", "1", "3");
    $vendoremail = ("name1@email.com", "name2@email.com", "name1@email.com");

我想将来自相同电子邮件地址的数据分组,并向每个地址发送一封电子邮件。

因此,一封电子邮件将被发送至name1@email.com,其中包含“A”和“C”项以及电子邮件正文中的数量“2”和“3”。

另一封电子邮件将发送至name2@email.com,电子邮件正文中包含“B”项和数量“1”。

有人知道实现这个目标的最佳方法吗?

4 个答案:

答案 0 :(得分:4)

您可以通过GROUP_CONCAT()将值分组为以逗号分隔的字符串,并可选择将它们拆分为PHP:

SELECT 
  GROUP_CONCAT(itemnumber) AS items,
  GROUP_CONCAT(quantity) AS quantities,
  vendoremail
FROM orders
WHERE orderid = '$orderID'
GROUP BY vendoremail

这将产生如下结果:

name1@email.com    A,C    2,3
name2@email.com    B      1

在PHP中,如果需要,可以explode()将列表返回到数组中以显示在电子邮件正文中。

$results = array();
while($row = mysql_fetch_array($query)){
   $results[] = $row; 
}
foreach ($results as $result) {
  $email = $result['vendoremail'];
  $items = explode(",", $result['items']); // now it's an array...
  $quantities = explode(",", $result['quantities']);  // now it's an array...
}

答案 1 :(得分:0)

让我畏缩,但用引号将你的键名包装在数组中!

在您原来的while循环中,您可以执行类似的操作。

while($row = mysql_fetch_array($query)){
   $items[] = $row['itemnumber'];
   $quantity[] = $row['quantity'];
   $vendoremail[] = $row['vendoremail'];

   $emailList[$row['vendoremail']][] = $row;
} 
foreach ($emailList as $email => $itemList)
{
    $emailMessage = "Dear vendor, here is information about new orders:\n\n\n";
    foreach($itemList as $itemInfo)
    {
       $emailMessage .= "------\n";
       $emailMessage .= "item num: #".$itemInfo['itemnumber'];
       $emailMessage .= "quantity: ".$itemInfo['quantity'];
       $emailMessage .= "------\n\n";
    }
   $emailMessage .= "Sincerely,\nUs";

   mail($email, 'New Orders', $emailMessage, 'From: orders@ourcompany.com');
}

这只是我编写的一个简单的事情,所以我只是粗心地在那里投掷了一个换行符,但是从上面的代码中你应该希望得到使用多维数组的要点。

编辑:对于奖励积分,作为样式和数据库设计的问题,您真的应该有供应商表,供应商ID,供应商名称,电子邮件,联系人info等,然后在订单表上有一个指向供应商ID的外键列,因此您可以加入它,而不是在每行中存储可能重复和易失性(电子邮件地址可随时更改)数据。只是我的偏离主题优化$ 0.02。

答案 2 :(得分:0)

您可以使用电子邮件作为密钥创建两个数组($ items和$ quantity):

$query = mysql_query("SELECT * FROM orders WHERE orderID = '$orderID'");

while($row = mysql_fetch_array($query))
{
    $items[$row['vendoremail']][] = $row['itemnumber'];
    $quantity[$row['vendoremail']][] = $row['quantity'];
}

然后,只需迭代它们,检索每个包含的所有数据:

foreach ($items as $key => $val)
{
    /* where $key can also be used to retrieve from $quantity */
}

答案 3 :(得分:0)

鉴于array-n的每个成员都映射到array-n + 1,我将执行以下操作:

$groups = array();
while ($r = mysql_fetch_assoc($query)){
  if (!isset($groups[$r['email']])) {
    $groups[$r['email']] = array();
  }
  $groups[$r['email'][] = array($r['items'], $r['quantities']);
}

现在您可以遍历groups数组,其中每个电子邮件密钥都有一个或多个数组