根据foreach循环的结果设置一个变量


Setting a variable from the result of a foreach loop

我正在尝试创建一个变量,将包含从foreach循环创建的电子邮件列表。

当前PHP是这样的:

  // select all the emails from the users that are subscribed the email list
  $query = "SELECT * FROM users WHERE email_list = 0";
  $query_params = array(); 
  try { 
  $stmt = $db->prepare($query); 
  $result = $stmt->execute($query_params);
  } 
    catch(PDOException $ex) 
  { 
    die("Failed to run query: " . $ex->getMessage()); 
  } 
  $rows = $stmt->fetchAll();
  foreach($rows as $row):
    $email = $row['email'];
    echo "$email, ";
  endforeach;

该回显创建例如

email1, email2, email3 etc.

但是我想要的是能够设置一个变量,我可以在foreach之后使用,它将包含所有的电子邮件。

我已经尝试使用一个函数,然后设置一个变量与函数被调用。

像这样:

  function createEmailList() {
    $rows = $stmt->fetchAll();
    foreach($rows as $row):
      $email = $row['email'];
      echo "$email, ";
    endforeach;
  }
  echo createEmailList();

但是你可以想象这是行不通的。

谢谢,克雷格。

首先,您必须将$stmt传递到函数中。否则,在函数已知范围内,$stmt不存在。

其次,在循环中回显电子邮件不会将其作为列表放入变量中。您需要将它连接到一个字符串变量(或其他东西)中,而不仅仅是回显它。

第三,如果您希望函数像echo createEmailList(...);一样被调用,那么它需要return一个值。

第四,我讨厌vb风格的foreach语法,所以我把它改成了正常的语法。

 function createEmailList($stmt) 
 {
    $rows = $stmt->fetchAll();
    $emailS = '';
    foreach($rows as $row)
    {
      if($emailS!='')
      {
         //so it doesn't add the comma before first email 
         //nor after last email
         $emailS .= ', ';
      }
      $emailS .= $row['email'];
    }
    return $emailS;
  }
  echo createEmailList($stmt);
 function createEmailList($stmt) {
     $emails = array();
     foreach($stmt->fetchAll() as $row) {
         $emails[] = $row['email'];
     }
     return implode(', ', $emails);
 }
 echo createEmailList($stmt);

技巧来了

function createEmailList() {
// fetch rows from DB
    foreach($rows as $row){
        $emails[] = $row['email'];
    }
return $emails;
}