【问题标题】:Handling associative array and foreach in PHP在 PHP 中处理关联数组和 foreach
【发布时间】:2014-10-01 15:00:10
【问题描述】:

我正在尝试为我的邮件系统编写一个通用函数。

我打算做的是。

  1. 获取数组中的所有目标地址值和所需信息
  2. 将所有值存储在数据库中。

我从二维关联数组开始,但无法检索 foreach 中的值。

最后,foreach echo 语句应该是这样的

insert into my_table('name','to_address','subject','message','add_cc') values ('Author1','author1@gmail.com','Subject','Message','test@gmail.com');
insert into my_table('name','to_address','subject','message','add_cc') values ('Author2','author2@gmail.com','Subject','Message','test@gmail.com');
insert into my_table('name','to_address','subject','message','add_cc') values ('Author3','author3@gmail.com','Subject','Message','test@gmail.com');

下面是我的代码,我知道问题出在 foreach 循环上。即使关联数组在没有像 [0],[1],[2] 这样的数字序列的情况下被最小化,我也会很高兴。

<?php
$to_address = array(
    array( 'Name' => "Author1", 'Email' => 'author1@gmail.com' ),
    array( 'Name' => "Author2",  'Email' => 'author2@gmail.com' ),
    array( 'Name' => "Author3", 'Email' => 'author3@gmail.com')
);

$subject = "Subject";
$message = "Message";
$add_cc  = "test@gmail.com";
sendMail($to_address,$subject,$message,$add_cc);

function sendMail($to_address,$subject,$message,$add_cc) {
    foreach ($to_address as $key => $val) {
        foreach ($val as $key1 => $val1) {
            print_r($val1);
        }
    }
}

?>

谢谢, 金兹

编辑:

换句话说,我无法循环 $to_address 值,我需要帮助。

【问题讨论】:

    标签: php arrays for-loop multidimensional-array foreach


    【解决方案1】:

    这是您想要的代码 - 这将创建您需要的插入查询。

    <?php
    $to_address = array( array( 'Name' => "Author1", 'Email' => 'author1@gmail.com' ),
    array( 'Name' => "Author2",  'Email' => 'author2@gmail.com' ),
    array( 'Name' => "Author3", 'Email' => 'author3@gmail.com')
    );
    $subject = "Subject";
    $message = "Message";
    $add_cc  = "test@gmail.com";
    sendMail($to_address,$subject,$message,$add_cc);
    
    function sendMail($to_address,$subject,$message,$add_cc){
    
        foreach ($to_address as $key => $val) {
            $sqlStatement =  "INSERT INTO my_table('name','to_address','subject','message','add_cc') VALUES ('".$val['Name']."','".$val['Email']."','".$subject."','".$message ."','".$add_cc."');";
            echo "$sqlStatement <br/>";
        }
    }
    ?>
    

    【讨论】:

      【解决方案2】:

      您可以在单个 foreach 中检索值:

      function sendMail($to_address,$subject,$message,$add_cc){
      
          foreach ($to_address as $val) {
             $name = $val["Name"];
             $email = $val["Email"];
             echo "Name: $name, Email: $email <br\>\n";
          }
      }
      

      【讨论】:

        【解决方案3】:

        先备注

        • 使用能够告诉我变量内部内容的名称。像 $val => $key 这样的东西什么也没告诉我。 foreach ( $val as $key1 =&gt; $val1 ) 也没有
        • 缩进:用它,看看psr-*
        • 再次描述正在发生的事情。一个函数 sendMail 应该发送一封电子邮件。不打印查询

        解决方案

        $mailReceivers = array(
            array( 'Name' => "Author1", 'Email' => 'author1@gmail.com' ),
            array( 'Name' => "Author2",  'Email' => 'author2@gmail.com' ),
            array( 'Name' => "Author3", 'Email' => 'author3@gmail.com')
        );
        
        $subject = "Subject";
        $message = "Message";
        $add_cc  = "test@gmail.com";
        
        foreach ( $mailReceivers as $receiver )
        {
            parseMail($reciever['Name'], $reciever['Email'], $subject, $message, $add_cc);
        }
        
        function parseMail($name, $email, $subject, $message, $cc)
        {
            print 'INSERT INTO my_table ('name','to_address','subject','message','add_cc') VALUES ('. $name .', '. $email .', '. $subject .', '. $message .', '. $subject .')';
        }
        

        备注

        我调用函数 parseMail 是因为我认为您不想打印插入语句。随心所欲地称呼它。

        您似乎也不知道 foreach 是如何工作的。试一试,看看$key =&gt; $val 是什么意思。

        我还将 foreach 从函数中移出。这使它更便携,更易于阅读。

        【讨论】:

          【解决方案4】:

          这是你想要的吗?您可以只使用一个 foreach 并将每个数组放在 INSERT 中。

              $to_address = array(
                  array( 'Name' => "Author1", 'Email' => 'author1@gmail.com' ),
                  array( 'Name' => "Author2",  'Email' => 'author2@gmail.com' ),
                  array( 'Name' => "Author3", 'Email' => 'author3@gmail.com')
              );
          
              $subject = "Subject";
              $message = "Message";
              $add_cc  = "test@gmail.com";
              sendMail($to_address,$subject,$message,$add_cc);
          
          function sendMail($to_address,$subject,$message,$add_cc) {
                    foreach ($to_address as $val) {
                        $sql = "INSERT INTO my_table('name','to_address','subject','message','add_cc') 
                                VALUES ('".$val['Name']."','".$val['Email']."','".$subject."','".$message ."','".$add_cc."');";
                        echo $sql . "<br>";
                        //Use your Insert Statement
                    }
          }
          

          【讨论】:

            【解决方案5】:
               function sendMail($to_address,$subject,$message,$add_cc){
            
                        foreach ($to_address as $key => $val) {
            
                           extract($val);
                           // use the keys of $val array as variable names 
                           // http://php.net/manual/en/function.extract.php
            
                           // sql for data base query
                           $sql = "INSERT INTO my_table('name','to_address','subject','message','add_cc') VALUES ('".$Name."','".$Email."','".$subject."','".$message ."','".$add_cc."');";
            
                           echo $sql;
                        }
                    }
            

            【讨论】:

            • 简单的数组访问有什么问题?您只需要名称和 to_addreS。你所知道的数组可能有大量的键
            • 没什么,我只是喜欢使用提取,因为代码变得更具可读性并且变量变得不言自明。是的,使用带有大量键的数组会变得乏味
            【解决方案6】:

            这是你想要的吗?

            $link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
            
            foreach ($to_address as $val) {
            
            $sql = "insert into my_table('name','to_address','subject','message','add_cc') values (?,?,?,?,?)";
            $stmt = mysqli_prepare($link, $sql);
            mysqli_stmt_bind_param($stmt, $val['Name'], $val['Email'], $subject, $message, $add_cc);
            );
            
            mysqli_query($link, $sql);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-11-09
              • 1970-01-01
              • 2011-04-26
              • 1970-01-01
              • 2014-08-12
              • 2023-03-26
              • 2014-09-23
              相关资源
              最近更新 更多