array_combine 键名相同

array_combine with same key names

我正在尝试将电子邮件中的一些信息保存到数组中。 电子邮件内容是 html 表格,我正在使用 DOMDocument 方法 getElementsByTagName('td') 接收所有 td。

在 for 循环中,我遍历邮件文件夹中的所有电子邮件并将信息保存在数组中。看起来像这样:

function getMails()
{
    $mailbox = imap_mailboxmsginfo($this->imap);
    $msglength = $mailbox->Nmsgs;
    $domhtml = new DOMDocument();
    $arraykeys = [];
    $arrayvalues = [];
    // loop a) to iterate through all mails in the folder
    for ($i = 1; $i <= $msglength; $i++)
    {
        $html = imap_fetchbody($this->imap, $i, '2');
        $domhtml->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
        $tabledatas = $domhtml->getElementsByTagName('td');
        // loop aa) to save the heading td's in the html mail in an array
        for ($y = 0; $y < $tabledatas->length; $y+=2)
        {
            $arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':');
        }
        // loop ab) to save the content td's in the html mail in an array
        for ($z = 1; $z < $tabledatas->length; $z+=2)
        {
            $arrayvalues[] = ($tabledatas->item($z)->nodeValue);
        }
        // combine the 2 arrays into one array with all td's information      
        $array = array_combine($arraykeys, $arrayvalues);
  }
  imap_close($this->imap);
}

为什么我对 td 标题使用一个数组,对 td 内容使用一个数组可以通过查看邮件中的 html 来解释:

<h2>Section one</h2>

<table>
    <tr>
        <td>Heading_value_a:</td>
        <td>Content_value_a</td>
    </tr>
    <tr>
        <td>Heading_value_b:</td>
        <td>Content_value_b</td>
    </tr>
    <tr>
        <td>Heading_value_c:</td>
        <td>Content_value_c</td>
    </tr>
</table>

<h2>Section two</h2>

<table>
    <tr>
        <td>Heading_value_d:</td>
        <td>Content_value_d</td>
    </tr>
    <tr>
        <td>Heading_value_e:</td>
        <td>Content_value_e</td>
    </tr>
    <tr>
        <td>Heading_value_f:</td>
        <td>Content_value_f</td>
    </tr>
</table>

<h2>Section three</h2>

<table>
    <tr>
        <td>Heading_value_g:</td>
        <td>Content_value_g</td>
    </tr>
    <tr>
        <td>Heading_value_h:</td>
        <td>Content_value_h</td>
    </tr>
    <tr>
        <td>Heading_value_i:</td>
        <td>Content_value_i</td>
    </tr>
</table>

<h2>Subsection three</h2>

<table>
    <tr>
        <td>Heading_value_g:</td>
        <td>Content_value_g</td>
    </tr>
    <tr>
        <td>Heading_value_h:</td>
        <td>Content_value_h</td>
    </tr>
    <tr>
        <td>Heading_value_i:</td>
        <td>Content_value_i</td>
    </tr>
</table>

这给了我这个数组:

Array
(
    [Heading_value_a] => Content_value_a
    [Heading_value_b] => Content_value_b
    [Heading_value_c] => Content_value_c
    [Heading_value_d] => Content_value_d
    [Heading_value_e] => Content_value_e
    [Heading_value_f] => Content_value_f
    [Heading_value_g] => Content_value_g
    [Heading_value_h] => Content_value_h
    [Heading_value_i] => Content_value_i
)

当我将两个数组合二为一时,我丢失了第三小节的信息,因为第三小节的 td 标题与第三小节标题同名,新数组的索引也同名,这就是为什么我需要重命名第三小节的数组索引。第三小节 td 的索引为 42 或更高。我想出了如何给新数组一些其他索引名称来保存信息,方法是在循环 aa):

中将当前 td 索引添加到数组索引名称
if ($y <= 41)
{
    $arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':');
} else 
  {
    $arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':').$y;
  }

这给了我这个数组:

Array
(
   [Heading_value_a] => Content_value_a
   [Heading_value_b] => Content_value_b
   [Heading_value_c] => Content_value_c
   [Heading_value_d] => Content_value_d
   [Heading_value_e] => Content_value_e
   [Heading_value_f] => Content_value_f
   [Heading_value_g] => Content_value_g
   [Heading_value_h] => Content_value_h
   [Heading_value_i] => Content_value_i
   [Heading_value_g42] => Content_value_g
   [Heading_value_h44] => Content_value_h
   [Heading_value_i46] => Content_value_i
)

有没有办法将 2 和更大的数字添加到新的数组索引名称中?如果邮件有更多的小节,那么在新的数组索引中会出现三个,[Heading_value_g2], [Heading_value_h2], [Heading_value_i2], [Heading_value_g3], [Heading_value_h3], [Heading_value_i3] 等等。我的目标是以下数组:

Array
(
   [Heading_value_a] => Content_value_a
   [Heading_value_b] => Content_value_b
   [Heading_value_c] => Content_value_c
   [Heading_value_d] => Content_value_d
   [Heading_value_e] => Content_value_e
   [Heading_value_f] => Content_value_f
   [Heading_value_g] => Content_value_g
   [Heading_value_h] => Content_value_h
   [Heading_value_i] => Content_value_i
   [Heading_value_g2] => Content_value_g
   [Heading_value_h2] => Content_value_h
   [Heading_value_i2] => Content_value_i
)

我有想法用if条件初始化aa)循环中的$c之类的计数变量,并用三元运算符将其设置为td的值,td的步骤是从42到64小节三一,66到88为小节三二等一:

for ($y = 0; $y < $tabledatas->length; $y+=2)
{
    if ($y < 42)
    {
        $arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':');
    } else
    {
        $c = ($y >= 42 && $y <= 64) ? '2' : ($y >= 66 && $y <= 88 ? '3' : '');
        $arraykeys[] = rtrim($tabledatas->item($y)->nodeValue, ':').$c;
    }
}

这行得通,我收到了我想要的结果,但它不够动态,如果有一个或两个小节三,那么我必须编写具有更多条件的三元运算符才能工作有 3 个小节,三个:

$c = ($y >= 42 && $y <= 64) ? '2' : ($y >= 66 && $y <= 88 ? '3' : ($y >= 90 && $y <= 112 ? '4' : 'and more conditions' ));

有没有人提示我如何管理它以处理无限数量的第三小节? 提前谢谢你。

您应该考虑 "chunking" 元素的主关联数组来解决重复键覆盖的原始问题:

function.array-chunk.php