【问题标题】:PHP/Laravel 5.4 "Invalid argument supplied for foreach()"PHP/Laravel 5.4“为 foreach() 提供的参数无效”
【发布时间】:2018-10-06 01:40:16
【问题描述】:

我有一个基本的电子邮件数组,我试图遍历这些电子邮件,以便将值分配给另一个变量以通过 Laravel 邮件发送。这是数组的转储和死亡,$emails,在 foreach 之前:

array:4 [
  0 => "test@example.com"
  1 => "testTwo@example.com"
  2 => "testThree@example.com"
  3 => "testFour@example.com"
]

foreach 是:

foreach ($emails as $email) {
    $this->bcc = $email;
}

我不确定为什么会收到此错误,因为这显然是一个数组。最终我试图发送到多封电子邮件,但只是将此数组分配给可邮寄的密件抄送:

$this->bcc = $emails;

导致错误Illegal string offset 'address',尽管$this 的转储和死亡表明该数组位于bcc 属性中:

除了我对使用 Laravel 发送多封电子邮件一无所知之外,还有人看到这里的核心问题吗?干杯!

【问题讨论】:

  • 我觉得您需要共享更多代码,address 不在您的代码中,但显然会导致问题。可以分享更多代码吗?
  • 您将一个数组放在一个对象中,因此当您解析对象时,它会找到该数组,但不会解析它,因此您需要在你目前拥有的“foreach”。但是为了避免问题,由于对象中除了数组之外还可以有一些其他类型,请检查它是否是数组。
  • @AndyHolmes,来自 Laravel 的 Mailable.php。我还不确定如何解决这个问题,但它在我的雷达上。有一个 buildRecipients 方法: foreach (['to', 'cc', 'bcc', 'replyTo'] as $type) { foreach ($this->{$type} as $recipient) { $message->{$类型}($recipient['address'], $recipient['name']); } }
  • @Rick_Jellema,谢谢,我添加了一个检查: if (is_array($emails) || is_object($emails)) { foreach ($emails as $email) { $this->bcc = $电子邮件; } }

标签: php arrays laravel email laravel-5


【解决方案1】:

我最终通过发送一串地址而不是一个数组来解决这个问题,然后将字符串分解为一个键控数组:

class ContactEmail extends Mailable
{
use Queueable, SerializesModels;

private $data;
public $body;

/**
 * Create a new message instance.
 *
 * @return void
 */
public function __construct($data)
{
    $this->data = $data['data'];
    $this->body = $this->data['body'];
}

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    $addresses = explode(', ', $this->data['emails']);

    return $this->bcc($addresses)
                ->subject($this->data['subject'])
                ->markdown('emails.CustomerContact.Custom');
}

}

【讨论】:

    【解决方案2】:

    您遇到的错误是因为 bcc() 函数需要一个数组或带有“地址”键的数组数组。

    试试这样的:

    $emailArray = [];
    
    foreach($emails as $email) {
      emailArray[]["address"] = $email;
      emailArray[]["name"] = "testname";
    }
    
    $this->bcc = $emailArray;
    

    【讨论】:

    • 谢谢,但它们来自 DOM 输入的逗号分隔列表。
    • 那你需要解析它,让它有上面的形式。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 2022-01-27
    相关资源
    最近更新 更多