我正在使用我的PHP来获取数据以将它们存储在数组中。我对数组中的索引值有问题,因为索引值将以1开头,然后将其计数为2、3、4 ...等等,它应以0开头,然后是1、2、3。 .etc,因为我使用$i = 0;
以默认的零开始。
在这里我使用索引值从1开始的
if(isset($structure->parts) && count($structure->parts)) {
for($i = 0; $i < count($structure->parts); $i++) {
if (($structure->parts[$i]->ifdisposition) && ($structure->parts[$i]->disposition == 'attachment')) {
foreach($structure->parts[$i]->parameters as $object) {
if(strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['name'] = $object->value;
$attachments[$i]['attachment'] = '';
}
}
}
}
我尝试将$i++
更改为$i
,并尝试将$i++
放入for循环中,但这没用。
输出:
Array ( [1] => Array ( [is_attachment] => 1 [name] => 2019-01-23 (1).rar [attachment] => ) [2] => Array ( [is_attachment] => 1 [name] => email.zip [attachment] => ) )
应该是:
Array ( [0] => Array ( [is_attachment] => 1 [name] => 2019-01-23 (1).rar [attachment] => ) [1] => Array ( [is_attachment] => 1 [name] => email.zip [attachment] => ) )
这是完整的代码:
<?php
require_once "Mail.php";
require_once('Mail/IMAPv2.php');
$username = 'username';
$password = 'password';
$mailserver = '{imap.domain.com:993/imap/ssl/novalidate-cert}INBOX';
$mailbox = imap_open($mailserver, $username, $password) or die("Can't connect: " . imap_last_error());
$key = "key";
$email_number = openssl_decrypt(hex2bin('477'),'AES-128-CBC', $key);
$attach_id = $_GET['attid'];
/* get information specific to this email */
$overview = imap_fetch_overview($mailbox, $email_number, 0);
$message = imap_fetchbody($mailbox, $email_number, 2);
/* get mail structure */
$structure = imap_fetchstructure($mailbox, $email_number);
$attachments = array();
$attachment_number = 0;
if(isset($structure->parts) && count($structure->parts)) {
for($i = 0; $i < count($structure->parts); $i++) {
if (($structure->parts[$i]->ifdisposition) && ($structure->parts[$i]->disposition == 'attachment')) {
foreach($structure->parts[$i]->parameters as $object) {
if(strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['name'] = $object->value;
$attachments[$i]['attachment'] = '';
}
}
}
}
?>
我无法找出为什么索引值总是以1开头,而索引值应该以0开头,然后是1、2、3,因为每次索引值都会递增。
能给我一个例子,当我使用$i++
时,如何将索引值默认设置为0,然后将其计数为1、2、3、4、5 ...等。 ?
谢谢。
答案 0 :(得分:3)
这是因为$structure->parts[0]
在所有情况下都不匹配$structure->parts[$i]->disposition == 'attachment'
。
只有在正确的情况下才在数组中创建一个新项目,并且不要使用循环计数器使用简单的$arr[]
结构创建下一个事件
$attachments = array();
if(isset($structure->parts) && count($structure->parts)) {
foreach ($structure->parts as $part) {
if (($part->ifdisposition) && ($part->disposition == 'attachment')) {
foreach($part->parameters as $obj) {
if(strtolower($obj->attribute) == 'name') {
$t['is_attachment'] = true;
$t['name'] = $obj->value;
$t['attachment'] = '';
$attachments[] = $t
}
}
}
}
}
答案 1 :(得分:0)
尝试
foreach($structure->parts[$i]->parameters as $object) {
if(strtolower($object->attribute) == 'name') {
$attachment['is_attachment'] = true;
$attachment['name'] = $object->value;
$attachment['attachment'] = '';
$attachments[]=$attachment;
}
}
答案 2 :(得分:0)
如果您想知道为什么数组的索引以1而不是0开头,请向我们显示数组的定义。 但是,您也可以使用PHP array_keys函数获取数组键,从而使用for循环使用未知键来循环数组
$this->arr = [1 => 'one', 2 => 'two', 3 => 'three'];
$keys = array_keys($this->arr);
for($i = 0; $i < count($keys); $i++) {
$value = $this->arr[$keys[$i]];
echo 'val: ' .$value.'<br>';
}
或者您可以将两个foreach包裹在一起
foreach($structure->parts as $key => $part){
$part->ifdisposition = true;
$part->disposition = 'attachment';
if (($part->ifdisposition) && ($part->disposition == 'attachment')) {
foreach($part->parameters as $object) {
if(strtolower($object->attribute) == 'name') {
$attachments[$key]['is_attachment'] = true;
$attachments[$key]['name'] = $object->value;
$attachments[$key]['attachment'] = '';
}
}
}
}
另一种选择是使用array_map重新映射数组的键,但是数组将被更改,因此,如果需要原始数组,可以将其缓存到另一个变量中。
答案 3 :(得分:0)
这里:
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['name'] = $object->value;
$attachments[$i]['attachment'] = '';
您将键设置为$i
,因此$structure->parts
中符合条件的第一个元素是循环中的第二个元素。要将$attachments
数组设置为零开始,只需要让PHP自己创建键即可:
$attachments[] = ['is_attachment' => true, 'name' => $object->value, 'attachment' => ''];