如何在PHP中将数组的索引值设置为0?

时间:2019-06-29 18:56:36

标签: php

我正在使用我的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 ...等。 ?

谢谢。

4 个答案:

答案 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' => ''];