簡體   English   中英

具有相同鍵名的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標題與小節三的標題具有相同的名稱,而新數組的索引將具有相同的名稱,這就是為什么我需要重命名第三小節的數組索引。 第三小節的索引為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的值,對於第三小節,從66到42,td的步驟從42到64 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;
    }
}

這行得通,並且我收到了我想要的結果,但是它不夠動態,如果有三個或三個以上的小節,那么我不得不寫一個具有更多條件的三元運算符來處理三個小節:

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

有沒有人暗示我如何處理無數的三個小節? 先感謝您。

您應該考慮“分塊”一個元素的主關聯數組,以解決重復鍵覆蓋的原始問題:

function.array-chunk.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM