php array - отправка одного электронного письма для каждого уникального адреса электронной почты с группировкой данных - PullRequest
3 голосов
/ 10 ноября 2011

У меня неопределенное количество элементов в массиве:

$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 ]

4 голосов
/ 10 ноября 2011

Вы можете сгруппировать значения в строки, разделенные запятыми, с помощью 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...
}
0 голосов
/ 10 ноября 2011

Учитывая тот факт, что каждый член массива-n отображается на массив-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, в котором каждый ключ электронной почты имеет один или несколько массивов

0 голосов
/ 10 ноября 2011

Вы можете создать два массива ($ items и $ amount), используя электронную почту в качестве ключа:

$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 голосов
/ 10 ноября 2011

Просто заставляю меня съеживаться, но оборачивайте ваши ключевые имена в массивах кавычками!

в вашем исходном цикле 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');
}

Это было просто быстроЯ написал, так что я просто небрежно добавил туда \ n переводы строки, но из вышеприведенного кода вы должны надеяться получить суть, используя многомерные массивы.

Редактировать: Для бонусных баллов,Что касается стиля и дизайна базы данных, у вас на самом деле должна быть таблица поставщиков с идентификатором поставщика, именем поставщика, адресом электронной почты, контактной информацией и т. д., а затем столбец внешнего ключа в таблице заказов, который указывает наидентификатор поставщика, так что вы можете присоединиться к нему и не хранить потенциально дублирующиеся и изменчивые (адреса электронной почты могут измениться в любой момент) данные в каждой строке.Просто моя не по теме оптимизация $ 0,02.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...