2011-11-10 10 views
3

我有一个数组中元素的无限量:PHP阵列 - 发送一个电子邮件为每一个独特的电子邮件地址有数据组合在一起

$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 = ("[email protected]", "[email protected]", "[email protected]"); 

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

因此,一封电子邮件会通过邮件正文中的项目“A”和“C”以及数量“2”和“3”发送到[email protected]

另一封电子邮件会在电子邮件正文中以“B”项和数量“1”发送到[email protected]

任何人都知道完成此任务的最佳方法?

回答

4

可以组通过GROUP_CONCAT()和可选的值转换成以逗号分隔的字符串备份在PHP中割裂开来:

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

这将产生类似的结果:

[email protected] A,C 2,3 
[email protected] 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

请记住,用于保存结果的缓冲区长度由服务器变量'group_concat_max_len'控制,默认值为1024.任何额外的字符被简单地删除。请参阅http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_group_concat_max_len – VolkerK

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: [email protected]'); 
} 

这只是一个快速的事我写了,所以我只是不小心在那里扔\ n换行符,但是从上面的代码,你应该希望得到使用多维数组的要点。

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

0

你可以创建一个使用电子邮件作为主要的两个数组($项目和$数量):

$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 */ 
} 
0

鉴于到阵列-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']); 
} 

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

相关问题