Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何正确地创建一个PHP数组,以便稍后循环并获取每一条信息?_Php_Mysql_Arrays_Email_Phpmailer - Fatal编程技术网

我如何正确地创建一个PHP数组,以便稍后循环并获取每一条信息?

我如何正确地创建一个PHP数组,以便稍后循环并获取每一条信息?,php,mysql,arrays,email,phpmailer,Php,Mysql,Arrays,Email,Phpmailer,我有一个mysql表,其中有许多用户(姓名、电子邮件和通知,如果他们需要电子邮件通知,则为是;如果他们不需要,则为否) 我想查询需要通知的人的所有姓名/电子邮件/用户名(即notify='yes'),并将它们放入一个数组中供以后使用 $sql = "SELECT userid, firstname, lastname, email, notify FROM users WHERE notify = 'yes'"; $getnotify = mysqli_query($connec

我有一个mysql表,其中有许多用户(姓名、电子邮件和通知,如果他们需要电子邮件通知,则为是;如果他们不需要,则为否)

我想查询需要通知的人的所有姓名/电子邮件/用户名(即notify='yes'),并将它们放入一个数组中供以后使用

$sql = "SELECT userid, firstname, lastname, email, notify FROM users
    WHERE notify = 'yes'";
    $getnotify = mysqli_query($connection, $sql);
    if (!$getnotify) {
    die("Database query failed: " . mysqli_error());
    } else {
        while ($row = mysqli_fetch_assoc($getnotify)) {
            //get emails, add comma after if necessary
            $notifyemailsarray[$row['email']]=$row['firstname']." ".$row['lastname']. " " . $row['userid'];
        }
    }
它的工作原理和输出如下:

Array
(
    [jj@gmail.com] => John Jones 331322
    [billw@yahoo.com] => Bill Wilson 331323
    [kenny896@gmail.com] => Kenny Smith 331347
    [gl222@hotmail.com] => Greg Lawson 331331
    [chrisc1987@gmail.com] => Chris Connors 331325
)
两个问题

  • 次要旁注问题:如果数据库中有多个条目具有相同的电子邮件地址(例如“kenny896@gmail.com),则该数组只包含一次。它似乎正在删除重复项。这实际上是我想要的,但这是对的吗?它应该自己做吗

  • 稍后,使用我在上面创建的数组,我使用PHPMailer向列表中的每个人发送唯一的电子邮件


  • 请注意,在正文中,我显示了它们的名称(使用$name)。那很好。但我还想列出他们的userid,在这里我有“$userid”。我如何在开始时创建数组(并构造后续的foreach循环)来简化这一过程?在我上面的代码中,在名字后面粘贴它肯定是错误的方法(对不起,看起来可能很痛苦,哈哈)。简而言之,我想创建一个阵列,这样在我循环浏览和发送每个人的电子邮件时,就可以很容易地获取每个人的电子邮件、姓名和用户ID(这样他们的电子邮件就可以是唯一的/个性化的)。

    首先,关于重复数据消除-是的,PHP就是这么做的。关联数组(在您的情况下,通过
    email
    )只能有一个键,因此,如果表中的每封电子邮件有多行,则输出数组中将仅包含结果集中最新的一行。实际上,如果遇到另一个,PHP会覆盖上一个。在这里最好的做法是修复源数据并删除其中的重复数据,如果您不希望它们存在的话。否则,如果您不能确定它们在源表中的顺序,则可能无法确定哪些副本进入了输出数组

    现在转到数组结构。考虑“代码”>电子邮件> /代码>的索引,正如您已经做的那样,但只需保持整个行的已获取数组,而不是串接字符串。然后,在构建电子邮件时,您就拥有了所需的所有部分,但那时您必须组合起姓名。如果您需要向输出电子邮件中添加任何其他详细信息,或者将来向表(和查询)中添加更多列,那么您已经可以在电子邮件中使用它们了

    while ($row = mysqli_fetch_assoc($getnotify)) {
        // Keep the entire fetched row, indexed by email
        $notifyemailsarray[$row['email']] = $row;
    }
    
    构建电子邮件时,只需通过其数组键(列名)访问这些值

    注意:这还将
    email
    notify
    键保留在数组中,您可以忽略这些键。我建议您继续通过
    电子邮件
    建立索引,而不是仅仅依靠阵列中的电子邮件值,因为您仍然需要它来处理通过阵列键进行的“意外”重复数据消除

  • 是的,这很正常。数组上的键必须是唯一的。否则,您将如何区分它们

  • 最简单的方法是为数组中的每个用户存储一个数组。因此,您的数据将如下所示:

    Array
    (
        [jj@gmail.com] => John Jones 331322
        [billw@yahoo.com] => Bill Wilson 331323
        [kenny896@gmail.com] => Kenny Smith 331347
        [gl222@hotmail.com] => Greg Lawson 331331
        [chrisc1987@gmail.com] => Chris Connors 331325
    )
    
    排列 ( [jj@gmail.com] => [ [0]=>约翰 [1] =>琼斯 [2] => 331322 )

  • 要创建该数据结构,只需更改以下内容:

    $notifyemailsarray[$row['email']]=$row['firstname']." ".$row['lastname']. " " . $row['userid'];
    
    为此:

    $notifyemailsarray[$row['email']] = [ $row['firstname'], $row['lastname'], $row['userid']];
    

    我们没有看到您的任何评论-这些答案满足您的需要吗?是的,很抱歉延迟,两个答案都很好,非常感谢!
    $notifyemailsarray[$row['email']] = [ $row['firstname'], $row['lastname'], $row['userid']];