在 for 循环内的 PHP 数组中未正确索引项目
Item not being properly indexed in PHP array inside of for loop
我有一个 for 循环,它使用 PHP 的 IMAP 函数从电子邮件中提取附件。这适用于一个附件,但无法从一封邮件中提取多个附件。请参阅下面的代码 -
for ($i = 0; $i < $count; $i++) {
$attachments[$i] = array( 'is_attachment' => FALSE );
if ($email['structure']->parts[$i]->ifdparameters) {
foreach ($email['structure']->parts[$i]->dparameters as $object) {
if (strtolower($object->attribute) == 'filename') {
$attachments[$i]['is_attachment'] = TRUE;
$attachments[$i]['filename'] = $object->value;
}
}
}
if ($email['structure']->parts[$i]->ifparameters) {
foreach ($email['structure']->parts[$i]->parameters as $object) {
if (strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = TRUE;
$attachments[$i]['name'] = $object->value;
}
}
}
if ($attachments[$i]['is_attachment']) {
$attachments[$i]['attachment'] = imap_fetchbody($this->conn, $email['index'], $i+1);
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
}
error_log(print_r($attachments[$i], TRUE));
error_log(print_r($attachments, TRUE));
}
第二个附件似乎没有正确添加到数组的索引中。我的错误日志显示每个值 (0, 1, 2) 的 $attachment[$i] 值,但是,$attachment 仅包含 2 个索引 (0, 1)。第一个是空白值(电子邮件的一部分),第二个和第三个是附件。请参阅下面的示例错误日志输出 -
[13-Jun-2015 16:19:54 Europe/Berlin] Array ( [is_attachment] => )
[13-Jun-2015 16:19:54 Europe/Berlin] Array ( [0] => Array ([is_attachment] => ))
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[is_attachment] => 1
[filename] => 2015-06-12_1048.png
[name] => 2015-06-12_1048.png
[attachment] => ‰PNG
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[0] => Array ( [is_attachment] => )
[1] => Array (
[is_attachment] => 1
[filename] => 2015-06-12_1048.png
[name] => 2015-06-12_1048.png
[attachment] => ‰PNG
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[is_attachment] => 1
[filename] => 5812548c-d445-4a18-a56d-e2698fdfd99b.jpg
[name] => 5812548c-d445-4a18-a56d-e2698fdfd99b.jpg
[attachment] => ÿØÿà
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[0] => Array ( [is_attachment] => )
[1] => Array (
[is_attachment] => 1
[filename] => 2015-06-12_1048.png
[name] => 2015-06-12_1048.png
[attachment] => ‰PNG
如您所见,第三项 $attachments[2] 是一个数组 [attachment] => ÿØÿà,但是当我打印 $attachments 时它并没有添加到数组中。我真的很困惑为什么它在打印 $attachments[$i] 而不是 $attachments 时显示。有什么想法吗?
更新:由于二进制文件 + 可能为空字符,错误记录被破坏。问题仍然存在,但我无法拉出多个附件。我将 $attachments 数组中的二进制文件保存到磁盘,但只保存了一个附件,而不是两个。为什么只保存第一个二进制文件?
好吧,那我把这个作为答案发布,所以这个问题可以标记为已回答:
这似乎是一个纯粹的视觉错误。
您提供的错误日志似乎不完整,任何 [attachment] =>
之后的所有输出似乎都被切断了(至少应该有右括号来关闭 Array ( ...
,对吧?)。
这很可能是由
引起的
- 那些包含空字符 (
[=12=]
) 的文件,这很可能是特定长度的二进制文件。
- 错误处理程序不使用字节数组,而是使用 C 风格的字符串,其结尾由所述空字符指示。
所以当记录数据时,它似乎被破坏了,而实际上,它很好。
我有一个 for 循环,它使用 PHP 的 IMAP 函数从电子邮件中提取附件。这适用于一个附件,但无法从一封邮件中提取多个附件。请参阅下面的代码 -
for ($i = 0; $i < $count; $i++) {
$attachments[$i] = array( 'is_attachment' => FALSE );
if ($email['structure']->parts[$i]->ifdparameters) {
foreach ($email['structure']->parts[$i]->dparameters as $object) {
if (strtolower($object->attribute) == 'filename') {
$attachments[$i]['is_attachment'] = TRUE;
$attachments[$i]['filename'] = $object->value;
}
}
}
if ($email['structure']->parts[$i]->ifparameters) {
foreach ($email['structure']->parts[$i]->parameters as $object) {
if (strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = TRUE;
$attachments[$i]['name'] = $object->value;
}
}
}
if ($attachments[$i]['is_attachment']) {
$attachments[$i]['attachment'] = imap_fetchbody($this->conn, $email['index'], $i+1);
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
}
error_log(print_r($attachments[$i], TRUE));
error_log(print_r($attachments, TRUE));
}
第二个附件似乎没有正确添加到数组的索引中。我的错误日志显示每个值 (0, 1, 2) 的 $attachment[$i] 值,但是,$attachment 仅包含 2 个索引 (0, 1)。第一个是空白值(电子邮件的一部分),第二个和第三个是附件。请参阅下面的示例错误日志输出 -
[13-Jun-2015 16:19:54 Europe/Berlin] Array ( [is_attachment] => )
[13-Jun-2015 16:19:54 Europe/Berlin] Array ( [0] => Array ([is_attachment] => ))
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[is_attachment] => 1
[filename] => 2015-06-12_1048.png
[name] => 2015-06-12_1048.png
[attachment] => ‰PNG
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[0] => Array ( [is_attachment] => )
[1] => Array (
[is_attachment] => 1
[filename] => 2015-06-12_1048.png
[name] => 2015-06-12_1048.png
[attachment] => ‰PNG
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[is_attachment] => 1
[filename] => 5812548c-d445-4a18-a56d-e2698fdfd99b.jpg
[name] => 5812548c-d445-4a18-a56d-e2698fdfd99b.jpg
[attachment] => ÿØÿà
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
[0] => Array ( [is_attachment] => )
[1] => Array (
[is_attachment] => 1
[filename] => 2015-06-12_1048.png
[name] => 2015-06-12_1048.png
[attachment] => ‰PNG
如您所见,第三项 $attachments[2] 是一个数组 [attachment] => ÿØÿà,但是当我打印 $attachments 时它并没有添加到数组中。我真的很困惑为什么它在打印 $attachments[$i] 而不是 $attachments 时显示。有什么想法吗?
更新:由于二进制文件 + 可能为空字符,错误记录被破坏。问题仍然存在,但我无法拉出多个附件。我将 $attachments 数组中的二进制文件保存到磁盘,但只保存了一个附件,而不是两个。为什么只保存第一个二进制文件?
好吧,那我把这个作为答案发布,所以这个问题可以标记为已回答:
这似乎是一个纯粹的视觉错误。
您提供的错误日志似乎不完整,任何 [attachment] =>
之后的所有输出似乎都被切断了(至少应该有右括号来关闭 Array ( ...
,对吧?)。
这很可能是由
- 那些包含空字符 (
[=12=]
) 的文件,这很可能是特定长度的二进制文件。 - 错误处理程序不使用字节数组,而是使用 C 风格的字符串,其结尾由所述空字符指示。
所以当记录数据时,它似乎被破坏了,而实际上,它很好。