我带来了访客选择的小册子,他们可以选择多本小册子。三天后,他们打算收到一封电子邮件,提醒他们他们选择的小册子。
这是我到目前为止所做的:
$time_query = "SELECT * FROM users WHERE time < (now() - INTERVAL 1 minute)"; //" //GROUP BY time does group them into an array... well.. it doesnt display duplicate timestamps, so assume it saves it to an array'";
$time_query_result = mysql_query($time_query, $db) or
die("Could not execute sql: $time_query");
$users = array();
while($row = mysql_fetch_array($time_query_result)) {
if (!array_key_exists($users[$row["id"]], $users)) {
$users[$row["id"]] = array('email' => $row["email"], 'brochures' => array());
$users[$row["id"]]["brochures"] = array('b' => $row["brochures"], 't' => $row["time"]);
}
}
foreach ($users as $user) {
$text = '<html><body><p>Brochure reminder</p>';
$i = 0;
foreach ($user["brochures"] as $brochure) {
$text .= 'Brochures:<br />'.$i++ . $row["b"];
}
$text .= '</body></html>';
mail($user["email"], $subject, $text, $headers);
}
我通过电子邮件而不是小册子名称获取数字,我认为它与array_key_exists的功能有关。
每当用户选择一本小册子时,它就会在数据库中创建自己的行,并且想法是拉入用户一次选择的多个小册子(按时间列),因为许多用户可以选择小册子一段时间。
任何帮助将不胜感激:)
答案 0 :(得分:0)
在你的'while'循环中,当你认为你想要追加它时,你会在'用户'数组中创建一个新的'小册子'元素。
if (!array_key_exists($row["id"], $users)) {
$users[$row["id"]] = array('email' => $row["email"], 'brochures' => array());
}
$users[$row["id"]]["brochures"][] = array('b' => $row["brochures"], 't' => $row["time"]);
然后在你的'foreach'中,你会想要使用宣传册变量:
foreach ($user["brochures"] as $brochure) {
$text .= 'Brochures:<br />'.$i++ . $brochure["b"];
}
答案 1 :(得分:0)
您当前的代码构建了一个用户数组,其中包含另一个索引为'brochures'的数组。该数组将始终包含两个值。
{
'b' => $row["brochures"]
't' => $row["time"])
}
关于这个事实,以下陈述没有意义:
foreach ($user["brochures"] as $brochure) {
}
您所做的只是使用索引“b”和“t”迭代这两个值。如果您想迭代一系列小册子,则需要调整代码。
另一方面,你有一些重要的错误:
foreach ($user["brochures"] as $brochure) {
$text .= 'Brochures:<br />'.$i++ . $row["b"];
}
如果你甚至不使用$ brochure变量,为什么要使用foreach?
$text .= 'Brochures:<br />'.$i++ . $row["b"];
$ row包含最后一行,这绝对不是你想要的。事实上,$ row超出了范围,用一种严肃的编程语言你可以看到它。
$row["id"]
你使用它大约三次。那么为什么不将它存储在变量$ id中呢?使用索引访问数组比仅访问变量更昂贵。
总的来说,我强烈建议您切换到面向对象的方法,以便在阵列解决方案中摆脱阵列中这些丑陋的数组......