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