массив php — отправка одного электронного письма для каждого уникального адреса электронной почты, группирующего данные вместе

#php #mysql #arrays #email

#php #mysql #массивы #Адрес электронной почты

Вопрос:

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

 $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» в теле электронного письма.

Кто-нибудь знает лучший способ добиться этого?

Ответ №1:

Вы можете сгруппировать значения в строки, разделенные запятыми, через 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. Имейте в виду, что длина буфера, используемого для хранения результата, контролируется переменной сервера group_concat_max_len , которая по умолчанию равна 1024. Любой дополнительный символ просто отбрасывается. смотрите dev.mysql.com/doc/refman/5.0/en /…

Ответ №2:

Вы могли бы создать два массива ($ 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:

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

в вашем исходном цикле 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:nnn";
    foreach($itemList as $itemInfo)
    {
       $emailMessage .= "------n";
       $emailMessage .= "item num: #".$itemInfo['itemnumber'];
       $emailMessage .= "quantity: ".$itemInfo['quantity'];
       $emailMessage .= "------nn";
    }
   $emailMessage .= "Sincerely,nUs";

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

Это была просто быстрая вещь, которую я написал, поэтому я просто небрежно вставил туда n разрывов строк, но приведенный выше код, который вы, надеюсь, должны уловить суть, используя многомерные массивы.

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

Ответ №4:

Учитывая тот факт, что каждый элемент 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['элементы'], $r['количества']);
}

и теперь вы можете выполнить итерацию по массиву groups, в котором каждый ключ электронной почты содержит один или несколько массивов