我在数组中有无限数量的项目:
$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”。
有人知道实现这个目标的最佳方法吗?
答案 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数组,其中每个电子邮件密钥都有一个或多个数组