2011-11-10 17 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']); 
} 

,現在您可以遍歷組數組,其中每個電子郵件密鑰有一個或多個陣列

相關問題