具有相同键名的array_combine

时间:2018-08-23 07:45:20

标签: php arrays string variable-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的值,对于第三小节,td的步骤是从42到64 ,对于第3小节2,第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' ));

有人暗示我如何处理无数的三个小节? 预先谢谢你。

1 个答案:

答案 0 :(得分:0)

您应该考虑“分块”一个元素的主关联数组,以解决重复密钥覆盖的原始问题:

function.array-chunk.php